卿学姐与诡异村庄

Time Limit: 4500/1500MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)

Submit Status

日复一日,年复一年,春去秋来。

卿学姐终于从天行廖那里毕业啦。出山的卿学姐首先来到了一个诡异的村庄。

在这个村庄中,只有两种人,一种是好人,一种是坏人。

好人只说真话,坏人只说假话。

村庄虚伪的平静由于卿学姐的到来,终于被打破了。

人们开始互相指控,每个人都会说另外一个人是否是好人。

卿学姐修行途中只学会了膜法,却不谙世事,所以卿学姐无法确认哪些人是好人,哪些人是坏人。

但是机智的卿学姐意识到可以通过这些人的指控来分辨。

现在告诉你村庄中每个人指控谁是否为好人,请问是否有个合理的分类能够符合所有的指控。

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
2 2
3 1
1 2
Time to show my power
3
2 2
3 2
1 2
One face meng bi

Hint

第一组样例中,如果1是好人,2和3都是坏人,就能解释得通这些指控

Source

2016 UESTC Training for Data Structures

代码

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<algorithm>
 5 #include<vector>
 6 #include<queue>
 7 const int MAXN=1000005;
 8 using namespace std;
 9
10 int vis[MAXN],N,next_[MAXN],think_huai[MAXN],col[MAXN];
11 vector<int> vec;
12 //1(2-1)是坏人,0是好人
13 int dfs(int x){
14     vis[x]=1;
15     if( next_[x] && !vis[next_[x] ] ) dfs( next_[x] );
16     vec.push_back(x);
17 }
18
19 int paint(int x,int c){
20     vis[x]=1;//不管怎样都已经访问 ,但col不一样
21     col[x]=c; //之后染色成功才会进行染色
22
23     if(next_[x]){
24         if(c){//如果x是坏人,染反色
25             if(col[next_[x]]>=0){//如果儿纸已经染色
26                 if( (think_huai[x]^1) != col[next_[x]] ) {col[x]=-1;return 0;}//儿纸不成功就不染
27             }
28             else if(!paint(next_[x],think_huai[x]^1)) {col[x]=-1;return 0;}
29         }
30         else{
31             if(col[next_[x]]>=0){
32                 if( (think_huai[x]) != col[next_[x]] ) {col[x]=-1;return 0;}
33             }
34             else if(!paint(next_[x],think_huai[x])) {col[x]=-1;return 0;}
35         }
36     }
37
38     return 1;
39 }
40
41 int scc(){
42     memset(vis,0,sizeof(vis));
43     for(int i=1;i<=N;i++)
44         if(!vis[i]) dfs(i);
45
46     memset(vis,0,sizeof(vis));
47     for(int i=N-1;i>=0;i--){
48          int now=vec[i];
49         if(!vis[now]){
50             if(!paint(now,1)){
51                 if(!paint(now,0)){
52                     puts("One face meng bi");
53                     exit(0);
54                 }
55             }
56         }
57     }
58 //    paint(1,1);
59     return 1;
60 }
61
62 int main(){
63 //    freopen("01.in","r",stdin);
64     scanf("%d",&N);
65     for(int i=1;i<=N;i++){
66         int flag=0,tmp=0;
67         scanf("%d%d",&tmp,&flag);
68         next_[i]=tmp;think_huai[i]=flag-1;
69     }
70
71     memset(col,-1,sizeof(col));
72     if(scc()) puts("Time to show my power");
73     return 0;
74 } 

长长的可能会TLE的二分图

据说并查集是正解,类似食物链,待写~

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<algorithm>
 5 #include<vector>
 6 #include<queue>
 7 const int MAXN=100005;
 8 using namespace std;
 9
10 int N;
11 int think_list[MAXN],think_label[MAXN],vis[MAXN];
12 int fa[2*MAXN],d[MAXN];
13 //fa 前一半是好人 后一半是坏人
14
15 int Find(int a){
16     if(a==fa[a]) return a;
17     else return fa[a]=Find(fa[a]);
18 }
19
20 void unite(int a,int b){
21     int ta=Find(a),tb=Find(b);
22     if(ta!=tb) fa[ta]=tb;
23 }
24
25 int check(int x,int c){
26     d[x]=c;
27     vis[x]=1;
28     if(think_list[x]){
29         int to=think_list[x],flag=think_label[x];
30         if(!c){//如果c是好人
31             if(vis[to]){
32                 if(Find(x)==Find(to+MAXN)&&flag==d[to]^1) {vis[x]=0;return 0;}
33                 if(Find(x)==Find(to)&&flag==d[to]^1) {vis[x]=0;return 0;}
34             }
35             if(!vis[to]&&!check(to,flag)) {vis[x]=0;return 0;}
36         }
37         else{
38             if(vis[to]){
39                 if(Find(x)==Find(to+MAXN)&&flag==d[to]) {vis[x]=0;return 0;}
40                 if(Find(x)==Find(to)&&flag==d[to]) {vis[x]=0;return 0;}
41             }
42             if(!vis[to]&&!check(to,flag^1)) {vis[x]=0;return 0;}
43         }
44     }
45     return 1;
46 }
47
48 int main(){
49 //    freopen("01.in","r",stdin);
50     memset(d,-1,sizeof(d));
51
52     scanf("%d",&N);
53     for(int i=1;i<2*MAXN;i++) fa[i]=i;
54
55     for(int i=1;i<=N;i++){
56         int flag,x;
57         scanf("%d%d",&x,&flag);flag-=1;
58         think_list[i]=x;
59         think_label[i]=flag;//1是坏人 0是好人
60
61         if(flag==0){
62             unite(i,x);
63     //        unite(i+MAXN,x);
64         }
65         else{//坏人
66             unite(i,x+MAXN);
67     //        unite(i+MAXN,x+MAXN);
68         }
69     }
70     for(int i=1;i<=N;i++){
71         if(!vis[i]){
72             if(!check(i,0)){
73                 if(!check(i,1)){
74                     puts("One face meng bi");
75                     exit(0);
76                 }
77             }
78         }
79     }
80     puts("Time to show my power");
81     return 0;
82 }

长长的速度没差多少的并查集

转载于:https://www.cnblogs.com/radiumlrb/p/5927284.html

cdoj 1328 卿学姐与诡异村庄 Label:并查集 || 二分图染色相关推荐

  1. 卿学姐与诡异村庄(并查集)

    C - 卿学姐与诡异村庄 Time Limit: 4500/1500MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Sub ...

  2. CDOJ 1292 卿学姐种花(暴力,分块,线段树)

    众所周知,在喵哈哈村,有一个温柔善良的卿学姐. 卿学姐喜欢和她一样美丽的花.所以卿学姐家的后院有很多的花坛. 卿学姐有n 个花坛,一开始第 i个花坛里有 A[i] 朵花.每过一段时间,卿学姐都会在花坛 ...

  3. CDOJ 1292 卿学姐种花 暴力 分块 线段树

    卿学姐种花 题目连接: http://acm.uestc.edu.cn/#/problem/show/1292 Description 众所周知,在喵哈哈村,有一个温柔善良的卿学姐. 卿学姐喜欢和她一 ...

  4. CDOJ 1292 卿学姐种花(分块)

    题目链接:点击打开链接 思路: 由于是一个区间更新问题, 而且更新的值不一样, 所以我们考虑分块.  对于一个块, 我们维护第i块的第一个元素被加了多少了sum[i],第i块被更新了多少次cnt[i] ...

  5. cdoj1344卿学姐种美丽的花

    地址:http://acm.uestc.edu.cn/#/problem/show/1344 题目: 卿学姐种美丽的花 Time Limit: 8000/4000MS (Java/Others)    ...

  6. CDOJ 1281 暴兵的卿学姐 构造题

    暴兵的卿学姐 题目连接: http://acm.uestc.edu.cn/#/problem/show/1281 Description 沈宝宝又和卿学姐开始玩SC2了! 自从沈宝宝学会新的阵型后,就 ...

  7. D - 卿学姐与魔法

    卿学姐与魔法 Time Limit: 1200/800MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Sta ...

  8. 卿学姐种花(线段树)

    卿学姐种花 Time Limit: 0/7500MS (Java/Others)     Memory Limit: 0/220000KB (Java/Others) 众所周知,在喵哈哈村,有一个温柔 ...

  9. 2016 UESTC Training for Data Structures O - 卿学姐种美丽的花 树状数组+等差数列

    O - 卿学姐种美丽的花 Time Limit: 8000/4000MS (Java/Others)     Memory Limit: 125535/65535KB (Java/Others) Su ...

最新文章

  1. Egret之eui.Scroller
  2. shell中获取时间
  3. 如何打开python的终端窗口_python终端窗口
  4. 三个实例演示 Java Thread Dump 日志分析
  5. 【CF1394B】Boboniu Walks on Graph【图论】【集合哈希】
  6. Lecture 14 Competive Analysis
  7. SpringCloud高频重点面试题,看这一篇就够了。
  8. 不同人眼中的“顶级程序员”,这差距也太大了吧!
  9. DataTable克隆行
  10. Hangman Judge UVA - 489
  11. Unity UGUI —— 鼠标穿透UI问题(Unity官方的解决方法)
  12. dedecms联动筛选_织梦dedecms图片联动筛选教程
  13. python爬取网易云音乐数据
  14. 1807520-99-5,DNP-PEG4-alcohol含有二硝基苯和羟基的PEG连接剂
  15. 香港常见问题扫盲贴(港币兑换/签注直飞/刷卡/酒店押金/关税/香港上网)
  16. C++[缺省参数]的理解
  17. word使用计算机题,巧用Word编题库
  18. 吴恩达深度学习课件和课后习题
  19. mysql 烂泥_烂泥:mysql帮助命令使用说明
  20. python异常捕获和写到mysql_python捕获数据库异常

热门文章

  1. android立体3D效果_谷歌裸眼3D动物意外蹿红,掀起一股AR体验小高潮
  2. 操作系统系统用c语言写,用C语言写关于操作系统的一个问题。
  3. 项目风险管理课程学习
  4. #6278. 数列分块入门 2
  5. Java读取json文件,再生产新的json文件
  6. 使用谷歌浏览器全文搜索资源文件中的关键词
  7. 2021-09-01
  8. java进程因机器内存不足被系统kill的定位
  9. 方形物体绕中心旋转的扭力_转轴扭力测试方案
  10. application实现网页计数_手把手教你利用爬虫爬网页(Python代码)