cdoj 1328 卿学姐与诡异村庄 Label:并查集 || 二分图染色
卿学姐与诡异村庄
Time Limit: 4500/1500MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)
日复一日,年复一年,春去秋来。
卿学姐终于从天行廖那里毕业啦。出山的卿学姐首先来到了一个诡异的村庄。
在这个村庄中,只有两种人,一种是好人,一种是坏人。
好人只说真话,坏人只说假话。
村庄虚伪的平静由于卿学姐的到来,终于被打破了。
人们开始互相指控,每个人都会说另外一个人是否是好人。
卿学姐修行途中只学会了膜法,却不谙世事,所以卿学姐无法确认哪些人是好人,哪些人是坏人。
但是机智的卿学姐意识到可以通过这些人的指控来分辨。
现在告诉你村庄中每个人指控谁是否为好人,请问是否有个合理的分类能够符合所有的指控。
Input
第一行一个整数NN,表示村庄总共有NN个人,村民从11开始编号到NN
1≤N≤1000001≤N≤100000
接下来NN行,每行两个整数,ai,tai,t,如果tt是11,那么说明第ii个人认为第aiai个人是好人。如果tt是22,那么说明第ii个人认为第aiai个人是坏人。
1≤ai≤N
Output
如果存在一个好人坏人的分类能够满足所有的指控,那么输出"Time to show my power",否则输出"One face meng bi"
Sample input and output
| Sample Input | Sample Output |
|---|---|
3 |
Time to show my power |
3 |
One face meng bi |
Hint
第一组样例中,如果1是好人,2和3都是坏人,就能解释得通这些指控
Source
代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
const int MAXN=;
using namespace std; int vis[MAXN],N,next_[MAXN],think_huai[MAXN],col[MAXN];
vector<int> vec;
//1(2-1)是坏人,0是好人
int dfs(int x){
vis[x]=;
if( next_[x] && !vis[next_[x] ] ) dfs( next_[x] );
vec.push_back(x);
} int paint(int x,int c){
vis[x]=;//不管怎样都已经访问 ,但col不一样
col[x]=c; //之后染色成功才会进行染色 if(next_[x]){
if(c){//如果x是坏人,染反色
if(col[next_[x]]>=){//如果儿纸已经染色
if( (think_huai[x]^) != col[next_[x]] ) {col[x]=-;return ;}//儿纸不成功就不染
}
else if(!paint(next_[x],think_huai[x]^)) {col[x]=-;return ;}
}
else{
if(col[next_[x]]>=){
if( (think_huai[x]) != col[next_[x]] ) {col[x]=-;return ;}
}
else if(!paint(next_[x],think_huai[x])) {col[x]=-;return ;}
}
} return ;
} int scc(){
memset(vis,,sizeof(vis));
for(int i=;i<=N;i++)
if(!vis[i]) dfs(i); memset(vis,,sizeof(vis));
for(int i=N-;i>=;i--){
int now=vec[i];
if(!vis[now]){
if(!paint(now,)){
if(!paint(now,)){
puts("One face meng bi");
exit();
}
}
}
}
// paint(1,1);
return ;
} int main(){
// freopen("01.in","r",stdin);
scanf("%d",&N);
for(int i=;i<=N;i++){
int flag=,tmp=;
scanf("%d%d",&tmp,&flag);
next_[i]=tmp;think_huai[i]=flag-;
} memset(col,-,sizeof(col));
if(scc()) puts("Time to show my power");
return ;
}长长的可能会TLE的二分图
据说并查集是正解,类似食物链,待写~
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
const int MAXN=;
using namespace std; int N;
int think_list[MAXN],think_label[MAXN],vis[MAXN];
int fa[*MAXN],d[MAXN];
//fa 前一半是好人 后一半是坏人 int Find(int a){
if(a==fa[a]) return a;
else return fa[a]=Find(fa[a]);
} void unite(int a,int b){
int ta=Find(a),tb=Find(b);
if(ta!=tb) fa[ta]=tb;
} int check(int x,int c){
d[x]=c;
vis[x]=;
if(think_list[x]){
int to=think_list[x],flag=think_label[x];
if(!c){//如果c是好人
if(vis[to]){
if(Find(x)==Find(to+MAXN)&&flag==d[to]^) {vis[x]=;return ;}
if(Find(x)==Find(to)&&flag==d[to]^) {vis[x]=;return ;}
}
if(!vis[to]&&!check(to,flag)) {vis[x]=;return ;}
}
else{
if(vis[to]){
if(Find(x)==Find(to+MAXN)&&flag==d[to]) {vis[x]=;return ;}
if(Find(x)==Find(to)&&flag==d[to]) {vis[x]=;return ;}
}
if(!vis[to]&&!check(to,flag^)) {vis[x]=;return ;}
}
}
return ;
} int main(){
// freopen("01.in","r",stdin);
memset(d,-,sizeof(d)); scanf("%d",&N);
for(int i=;i<*MAXN;i++) fa[i]=i; for(int i=;i<=N;i++){
int flag,x;
scanf("%d%d",&x,&flag);flag-=;
think_list[i]=x;
think_label[i]=flag;//1是坏人 0是好人 if(flag==){
unite(i,x);
// unite(i+MAXN,x);
}
else{//坏人
unite(i,x+MAXN);
// unite(i+MAXN,x+MAXN);
}
}
for(int i=;i<=N;i++){
if(!vis[i]){
if(!check(i,)){
if(!check(i,)){
puts("One face meng bi");
exit();
}
}
}
}
puts("Time to show my power");
return ;
}长长的速度没差多少的并查集
cdoj 1328 卿学姐与诡异村庄 Label:并查集 || 二分图染色的更多相关文章
- cdoj1328卿学姐与诡异村庄
地址:http://acm.uestc.edu.cn/#/problem/show/1328 题目: 卿学姐与诡异村庄 Time Limit: 4500/1500MS (Java/Others) ...
- C - 卿学姐与诡异村庄(并查集+One face meng bi)
卿学姐与诡异村庄 Time Limit: 4500/1500MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit ...
- CDOJ 1324 卿学姐与公主(分块)
CDOJ 1324 卿学姐与公主(分块) 传送门: UESTC Online Judgehttp://acm.uestc.edu.cn/#/problem/show/1324 某日,百无聊赖的卿学姐打 ...
- cdoj 1329 卿学姐与魔法 优先队列
卿学姐与魔法 Time Limit: 1200/800MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit Sta ...
- cdoj 1324 卿学姐与公主 线段树裸题
卿学姐与公主 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit St ...
- CDOJ 1292 卿学姐种花 暴力 分块 线段树
卿学姐种花 题目连接: http://acm.uestc.edu.cn/#/problem/show/1292 Description 众所周知,在喵哈哈村,有一个温柔善良的卿学姐. 卿学姐喜欢和她一 ...
- CDOJ 1324 卿学姐与公主 分块
题目地址 分块模板 #include<cstdio> #include<algorithm> #include<math.h> using namespace st ...
- cdoj1344卿学姐种美丽的花
地址:http://acm.uestc.edu.cn/#/problem/show/1344 题目: 卿学姐种美丽的花 Time Limit: 8000/4000MS (Java/Others) ...
- CDOJ 1281 暴兵的卿学姐 构造题
暴兵的卿学姐 题目连接: http://acm.uestc.edu.cn/#/problem/show/1281 Description 沈宝宝又和卿学姐开始玩SC2了! 自从沈宝宝学会新的阵型后,就 ...
随机推荐
- SVN 升级后出现You need to upgrade the working copy first.
今天将svn更新后,出现 svn: The working copy at 'E:\591woospace\kst_fashion_alipay_v1.2.0\src\com\kstapp\wansh ...
- SVN的忽略和只读使用方法学习记录
前言,先扯几句.最近学了GIT,虽然很肤浅,但是也算是用上了分布式版本管理控制系统.Linus很牛,他也很厌烦SVN,而我看这些都是工具,是否拿来使用主要看是否顺手.我赞同分布式版本管理控制,它有诸多 ...
- WinDbg 命令三部曲:(一)WinDbg 命令手册
本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 系列博文 <WinDbg 命令三部曲:(一)WinDbg 命令手册> <WinDb ...
- oracle限制ip訪問
我這oracle版本為11.2.0.4,裝的GRID,所以在grid用戶下編輯sqlnet.ora 1.cd /grid/product/11.2.0/network/admin 2.編輯sqlne ...
- 【leetcode】Reverse Words in a String
今天第一次在leetcode上提交了一个题目,据说这个网站基本上都是名企面试笔试题,今天无意一进去就看到第一题居然就是昨天的腾讯实习生笔试题,赶紧注册了个账号做题. 题目描述: Given an in ...
- hdu 3709 数位dp
数位dp,有了进一步的了解,模板也可以优化一下了 题意:找出区间内平衡数的个数,所谓的平衡数,就是以这个数字的某一位为支点,另外两边的数字大小乘以力矩之和相等,即为平衡数例如4139,以3为支点4*2 ...
- 利用Browser Link提高前端开发的生产力
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:Browser Link是VS 2013开始引入的一个强大功能,让前端代码(比如Ang ...
- 关于UltraISO打开iso文件后只有部分文件问题
背景:在安装CentOS 7的时候,用UltraISO打开之后,只有一个EFI文件,刻完U盘,却无法引导. 之前还以为偶没下载全,就又下了一遍,还好偶搞得的NetInstall,要不然就呵呵了. 解决 ...
- 四种方案解决ScrollView嵌套ListView问题(转)
以下文章转自@安卓泡面 在工作中,曾多次碰到ScrollView嵌套ListView的问题,网上的解决方法有很多种,但是杂而不全.我试过很多种方法,它们各有利弊. 在这里我将会从使用ScrollVie ...
- OVER(PARTITION BY)函数用法
OVER(PARTITION BY)函数介绍 开窗函数 Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个组返 ...