1. 程式人生 > >卿學姐與詭異村莊(並查集)

卿學姐與詭異村莊(並查集)

data input print 16px splay ide sub none break

日復一日,年復一年,春去秋來。

卿學姐終於從天行廖那裏畢業啦。出山的卿學姐首先來到了一個詭異的村莊。

在這個村莊中,只有兩種人,一種是好人,一種是壞人。

好人只說真話,壞人只說假話。

村莊虛偽的平靜由於卿學姐的到來,終於被打破了。

人們開始互相指控,每個人都會說另外一個人是否是好人。

卿學姐修行途中只學會了膜法,卻不諳世事,所以卿學姐無法確認哪些人是好人,哪些人是壞人。

但是機智的卿學姐意識到可以通過這些人的指控來分辨。

現在告訴你村莊中每個人指控誰是否為好人,請問是否有個合理的分類能夠符合所有的指控。

Input

第一行一個整數N,表示村莊總共有N個人,村民從1開始編號到

N

1≤N≤100000

接下來N行,每行兩個整數 ai,t,如果t1,那麽說明第i個人認為第ai個人是好人。如果t是2,那麽說明第i個人認為第ai個人是壞人。

1≤ai≤N

Output

如果存在一個好人壞人的分類能夠滿足所有的指控,那麽輸出"Time to show my power”,否則輸出"One face meng bi”

Sample Input

3
2 2
3 1
1 2

3
2 2
3 2
1 2

Sample Output

Time to show my power

One face meng bi

Hint

第一組樣例中,如果1是好人,2和3都是壞人,就能解釋得通這些指控

//非常強,竟然用並查集完美的解決了這個問題,有兩個並查集,就是將每個人說的話,當做真話處理,也當做假話處理,兩個並查集最後若沒有相交部分則成立,也就是,每個人的話都不會自相矛盾,則成立

http://blog.csdn.net/zsc2014030403015/article/details/51255172

但是,這種做法只在這種特定的時候才管用,如果一個人說了多句話呢,或者問你誰是好人,誰是壞人呢?還是很難哪,這種題。。。

代碼:

技術分享
 1 #include <bits/stdc++.h>
 2
using namespace std; 3 #define MX 100005 4 #define has 100000 5 int n; 6 int f[MX*2]; 7 8 int find_(int x) 9 { 10 if (x!=f[x]) 11 f[x]=find_(f[x]); 12 return f[x]; 13 } 14 int join(int a,int b) 15 { 16 int x=find_(a),y=find_(b); 17 if (x!=y) 18 f[x]=f[y]; 19 } 20 21 int main() 22 { 23 while (scanf("%d",&n)!=EOF) 24 { 25 for (int i=1;i<=n;i++) f[i]=i; 26 for (int i=has+1;i<=has+n;i++) f[i]=i; 27 for (int i=1;i<=n;i++) 28 { 29 int x,k; 30 scanf("%d%d",&x,&k); 31 if (k==1) 32 { 33 join(i,x); 34 join(has+i,has+x); 35 } 36 if (k==2) 37 { 38 join(i,has+x); 39 join(has+i,x); 40 } 41 } 42 int ok=1; 43 for (int i=1;i<=n;i++) 44 { 45 if (find_(i)==find_(has+i)) 46 { 47 ok=0; 48 break; 49 } 50 } 51 if (ok) 52 printf("Time to show my power\n"); 53 else 54 printf("One face meng bi\n"); 55 } 56 return 0; 57 }
View Code

卿學姐與詭異村莊(並查集)