poj1703(种类并查集)
题意:有两个犯罪集团,现在有两种操作,D [a] [b]表示a和b是属于不同犯罪集团的,A [a] [b] 是询问你a和b的关系,如果ab属于同一个犯罪集团,输出In the same gang. 如果ab属于不同犯罪集团,输出In different gangs. 否则输出 Not sure yet.
思路:赤裸裸的种类并查集,0代表ab属于同一集团,1代表不同,要是不在同个树里面,就是不确定.......
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define M 100005 int father[M],rank[M]; int find( int x) { if (x==father[x]) return x; int tmp=father[x]; father[x]=find(tmp); rank[x]=(rank[x]+rank[tmp])%2; return father[x]; } void liantong( int x, int y) { int tmp=find(x); int tmp1=find(y); if (tmp!=tmp1) { father[tmp1]=tmp; rank[tmp1]=(2-1+2-rank[y]+rank[x])%2; } } int main() { int text; scanf ( "%d" ,&text); while (text--) { int n,m; scanf ( "%d%d" ,&n,&m); for ( int i=0;i<=n;i++) { father[i]=i; rank[i]=0; } while (m--) { char ch[10]; int tmp,tmp1; scanf ( "%s%d%d" ,ch,&tmp,&tmp1); if (ch[0]== 'D' ) liantong(tmp,tmp1); else { int x=find(tmp); int y=find(tmp1); if (x==y) { int r=(2-rank[tmp]+rank[tmp1])%2; if (r==0) printf ( "In the same gang.\n" ); else printf ( "In different gangs.\n" ); } else printf ( "Not sure yet.\n" ); } } } return 0; } |
朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步