[洛谷P4617] [COCI2017-2018#5] Planinarenje
Description
\(Mirko\) 和 \(Slavko\) 喜欢一起去远足。
\(Mirko\) 偏好攀登山峰,而 \(Slavko\) 偏爱山谷。因此每次他们登上一座山峰后,\(Slavko\) 会决定下次去哪个山谷玩(如果存在索道),同理每次游玩一个山谷后,\(Mirko\) 会决定下次去攀登哪座山峰(如果存在索道)。于是,不会出现连续两次游玩山峰或者连续两次游玩山谷的情况。为了享受更多乐趣,他们不会去已经去过的景点。
如果他们逛完一个景点后,发现接下来无法乘坐索道前往任何可行的景点,那么这次旅行就结束了。这时,如果最终景点是山峰,则 \(Mirko\) 获胜,否则 \(Slavko\) 获胜。
假设两个人都足够聪明,请你计算:从任意一座山峰开始旅行,最终谁会获胜?
Input
第一行为两个正整数 \(N\)、\(M\),表示有 \(N\) 座山峰、\(N\) 个山谷和 \(M\) 条索道。
接下来 \(M\) 行,每行两个正整数 \(vi\) 、\(di\) ,表示在第 \(vi\) 座山峰和第 \(di\) 个山谷之间存在一条索道。任意一对山峰和山谷之间至多有一条索道。
Output
输出 \(N\) 行,每行一个字符串。第 \(i\) 行的字符串表示,假如旅行出发点是第 \(i\) 座山峰,那么最终谁会获胜。注意区分大小写。
Sample Input
4 5
2 2
1 2
1 1
1 3
4 2
Sample Output
Slavko
Mirko
Mirko
Mirko
HINT
【数据规模与约定】
对于 \(30%\) 的数据,\(1 \leq N \leq 10\) 。
对于额外 \(20%\) 的数据,任意两个景点之间至多存在一条简单路径,构成一个森林。
对于 \(100%\) 的数据,\(1 \leq N, M \leq 5000, M \leq N ^2\)。
来源:\(NOI2019\) 北京队集训
想法
考试的时候当然没想出来,就写了个50分的暴力(树形 \(dp\) +状压 \(dp\)),结果因为数组开小了爆零 QwQ
正解 %%% \(hzk\) 大神
比较套路,考虑做个二分图的最大匹配。
从某个山峰处出发,若当前没有匹配,且找不到增广路,则 \(Mirko\) 赢。
为什么呢?因为不管走到哪个山谷点,都可以顺着当前的匹配边走到山峰,直到到某个山峰没有出路。
那么,得出结论:
从某个山峰出发,若这个山峰在某个最大匹配中未被匹配,则 \(Mirko\) 赢,否则 \(Slavko\) 赢。
怎么判断呢?
先匈牙利算法跑出一个最大匹配,然后从每个非匹配的山峰点往前找增广路,找的过程中经过的山峰点都可能在某个最大匹配中未被匹配(可以这样理解,当前未匹配的点一次顺着当前找的过程中已经过的边匹配,这个新点就变成了此时的未匹配点)
代码
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int read(){
int x=0;
char ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
return x;
}
const int N = 5005;
struct node{
int v;
node *nxt;
}pool[N],*h[N*2];
int cnt;
void addedge(int u,int v){
node *p=&pool[++cnt];
p->v=v;p->nxt=h[u];h[u]=p;
}
int n,m;
int con[N],vis[N];
bool find(int u){
int v;
for(node *p=h[u];p;p=p->nxt){
if(vis[v=p->v-n]) continue;
vis[v]=1;
if(!con[v] || find(con[v])){
con[v]=u;
return true;
}
}
return false;
}
int no[N];
void getno(int u){
int v;
no[u]=1;
for(node *p=h[u];p;p=p->nxt){
if(vis[v=p->v-n]) continue;
vis[v]=1;
getno(con[v]);
}
}
int main()
{
int u,v;
n=read(); m=read();
for(int i=0;i<m;i++) {
u=read(); v=read()+n;
addedge(u,v);
}
for(int i=1;i<=n;i++){
memset(vis,0,sizeof(vis));
if(find(i)) no[i]=0;
else{
no[i]=1;
memset(vis,0,sizeof(vis));
getno(i);
}
}
for(int i=1;i<=n;i++)
if(no[i]) printf("Mirko\n");
else printf("Slavko\n");
return 0;
}
[洛谷P4617] [COCI2017-2018#5] Planinarenje的更多相关文章
- LOJ 2743(洛谷 4365) 「九省联考 2018」秘密袭击——整体DP+插值思想
题目:https://loj.ac/problem/2473 https://www.luogu.org/problemnew/show/P4365 参考:https://blog.csdn.net/ ...
- 洛谷P4382 [八省联考2018]劈配(网络流,二分答案)
洛谷题目传送门 说不定比官方sol里的某理论最优算法还优秀一点? 所以\(n,m\)说不定可以出到\(1000\)? 无所谓啦,反正是个得分题.Orz良心出题人,暴力有70分2333 思路分析 正解的 ...
- 2018.07.01洛谷P2617 Dynamic Rankings(带修主席树)
P2617 Dynamic Rankings 题目描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i ...
- 2018.07.17 洛谷P1368 工艺(最小表示法)
传送门 好的一道最小表示法的裸板,感觉跑起来贼快(写博客时评测速度洛谷第二),这里简单讲讲最小表示法的实现. 首先我们将数组复制一遍接到原数组队尾,然后维护左右指针分别表示两个即将进行比较的字符串的头 ...
- bzoj5248(洛谷4363)(2018九省联考)一双木棋
题目:https://www.luogu.org/problemnew/show/P4363 一种考虑状态数的方法:有几个用了k个格子的列,就在第k个0的左边插入几个1: 这也是求不降序列的个数的方法 ...
- 2018.10.30 一题 洛谷4660/bzoj1168 [BalticOI 2008]手套——思路!问题转化与抽象!+单调栈
题目:https://www.luogu.org/problemnew/show/P4660 https://www.lydsy.com/JudgeOnline/problem.php?id=1168 ...
- [洛谷P1842] 奶牛玩杂技
题目类型:贪心+证明,经典题 传送门:>Here< 题意:有\(N\)头奶牛,每个奶牛有一个重量\(W[i]\),力量\(S[i]\).定义每个奶牛的压扁程度为排在它前面的所有奶牛的总量之 ...
- 洛谷P3375 [模板]KMP字符串匹配
To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...
- 洛谷 P2058 海港 解题报告
P2058 海港 题目描述 小K是一个海港的海关工作人员,每天都有许多船只到达海港,船上通常有很多来自不同国家的乘客. 小K对这些到达海港的船只非常感兴趣,他按照时间记录下了到达海港的每一艘船只情况: ...
随机推荐
- Canvas动画:地球绕着太阳转
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...
- LuoguP3066 逃跑的BarnRunning Away From…
LuoguP3066 先吐槽一下,这道题名字好长啊 一个非常明显的思路,利用倍增数组不断向上跳.直到数值大于\(L\),然后直接差分统计答案就好了. 这种ZROI也考过,不多赘述了. 我们来考虑主席树 ...
- dotnet 如何调试某个文件是哪个代码创建
我发现了自己的软件,会在桌面创建一个 1.txt 文件,但是我不知道是哪个代码创建的,那么如何进行快速的调试找到是哪个代码创建的 最简单的方法是使用 VisualStudio 全局搜 1.txt 看是 ...
- CSS兼容性问题的解决方式(更新中···)
1.清除浮动的兼容性(低版本的浏览器不兼容问题) .clearfix:after{ content:""; clear:both; display:block; visibilit ...
- Qt3升至Qt4需要注意的几件事项浅谈
Qt3升至Qt4需要注意的几件事项浅谈 公司以前的项目是用Qt3写的,随着时间的推移慢慢显示出Qt3有多方面的限制,因此先公司决定用Qt4来改写这个项目,并为软件添加新功能,在此背景先编写此文章. 先 ...
- VMware卸载后再安装时网络连接处没有虚拟网卡
解决: 1.打开虚拟机,点击编辑,再点击虚拟网络编辑器 2.将所有的虚拟网络删除 3.删除完所有的虚拟网络之后再添加虚拟网络 4.按照自己想要的的连接方式添加上,网络连接处就会有虚拟网卡
- 使用 Git和Github
本地库初始化 git init 效果: 注意: .git 目录中存放的是本地库相关的子目录和文件,不要删除,也不要胡 乱修改. 设置签名 其实就是为了区分不同开发人员的身份需要设置一下自己的信息,包括 ...
- 记一次linux磁盘清理 - 已经删除的文件占用了大量磁盘空间
今天开发环境磁盘占满了,导致开发环境上的 nginx .redis 等组件总是报异常. 跳到系统根目录下 cd / 检查磁盘占用情况 df -h 哇,40G硬盘全用完了.看看是哪些文件占了那么多内存. ...
- [工具] Git版本管理(知识总结)
对以下文档进行了简要总结,方面复习: [工具] Git版本管理(一)(基本操作) [工具] Git版本管理(二)(分支) [工具] Git版本管理(三)(工作流) [工具] Git版本管理(四)(贡献 ...
- $CF888G\ Xor-MST$ 最小生成树
正解:最小生成树 解题报告: 传送门$QwQ$ 发现$Kruskal$和$Prime$都不太可做,于是考虑$B$算法. 先大概港下$B$算法的流程趴$QwQ$.大概就,每次对每个联通块找到最近的联通块 ...