The police office in Tadu City decides to say ends to the chaos, as launch actions to root up the TWO gangs in the city, Gang Dragon and Gang Snake. However, the police first needs to identify which gang a criminal belongs to. The present question is, given two criminals; do they belong to a same clan? You must give your judgment based on incomplete information. (Since the gangsters are always acting secretly.)
Assume N (N <= 10^5) criminals are currently in Tadu City, numbered from 1 to N. And of course, at least one of them belongs to Gang Dragon, and the same for Gang Snake. You will be given M (M <= 10^5) messages in sequence, which are in the following two kinds:
1. D [a] [b]
where [a] and [b] are the numbers of two criminals, and they belong to different gangs.
2. A [a] [b]
where [a] and [b] are the numbers of two criminals. This requires you to decide whether a and b belong to a same gang.
Assume N (N <= 10^5) criminals are currently in Tadu City, numbered from 1 to N. And of course, at least one of them belongs to Gang Dragon, and the same for Gang Snake. You will be given M (M <= 10^5) messages in sequence, which are in the following two kinds:
1. D [a] [b]
where [a] and [b] are the numbers of two criminals, and they belong to different gangs.
2. A [a] [b]
where [a] and [b] are the numbers of two criminals. This requires you to decide whether a and b belong to a same gang.
The first line of the input contains a single integer T (1 <= T <= 20), the number of test cases. Then T cases follow. Each test case begins with a line with two integers N and M, followed by M lines each containing one message as described above.
For each message "A [a] [b]" in each case, your program should give the judgment based on the information got before. The answers might be one of "In the same gang.", "In different gangs." and "Not sure yet."
1 5 5 A 1 2 D 1 2 A 1 2 D 2 4 A 1 4
Not sure yet. In different gangs. In the same gang.
n个人,标志位1到n;再进行m组操作D a b表示a和b不是同一个帮派,A a b询问a和b是不是同一个帮派种类并查集,除了开一个fa[i]来存储i的根节点,还要开一个r[i]来存储与同一个联通图根节点的关系,0表示在同一帮派,1表示不再同一个帮派
一旦输入确定ab不是同一帮派时,连接啊,啊ab所在的树,同时更新r
findfa函数寻找根节点时不断跟新r;更具根据子节点与父节点与爷爷结点的关系,推倒导子节点与爷爷结点的关系
#include <iostream> #include <cstdio> using namespace std; #define ma 100010 int fa[ma]; int r[ma]; int findfa(int x) { if(fa[x]==x)return x; int t=fa[x]; fa[x]=findfa(fa[x]); r[x]=(r[x]+r[t])%2;///根据子节点与父亲节点的关系和父节点与爷爷节点的关系,推导子节点与爷爷节点的关系 return fa[x]; } void mer(int a,int b) { int pa=findfa(a); int pb=findfa(b); fa[pa]=pb; r[pa]=(r[a]+r[b]+1)%2;///fa与a关系 +a与b的关系 + b与fb的关系 = fa与fb的关系 } int main() { int t;scanf("%d",&t); while(t--) { int n,m;scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { fa[i]=i;r[i]=0; } for(int i=0;i<m;i++) { int a,b;char ch;getchar(); scanf("%c%d%d",&ch,&a,&b); if(ch=='A') { if(findfa(a)!=findfa(b))printf("Not sure yet.\n"); else { if(r[a]==r[b])printf("In the same gang.\n"); else printf("In different gangs.\n"); } } else { mer(a,b); } } } }