Description
Input
Output
Sample Input
1 5 5 A 1 2 D 1 2 A 1 2 D 2 4 A 1 4
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> #define max1 100010 using namespace std; int par[max1]; int ran[max1]; int find(int a) { int rt; if(par[a]!=a) { int tmp=par[a]; par[a]=find(par[a]); ran[a]=(ran[a]^ran[tmp]); } return par[a]; } void build(int a,int b) { //cout<<"here"<<endl; int fa=find(a); int fb=find(b); // if(fa!=fb) // { par[fa]=fb; ran[fa]=~(ran[b]^ran[a]); // } } int main() { int t; int n,m; char kind; int p1,p2; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m);getchar(); for(int i=0; i<=n; i++) { par[i]=i; ran[i]=0; } for(int i=1; i<=m; i++) { scanf("%c %d %d",&kind,&p1,&p2);getchar(); if(kind==‘D‘) { build(p1,p2); } else { if(n==2) printf("In different gangs.\n"); else if(find(p1)==find(p2)) { if(ran[p1]==ran[p2]) printf("In the same gang.\n"); else printf("In different gangs.\n"); } else printf("Not sure yet.\n"); } } } return 0; }
这个是ac代码,原理很简单,就是并查集,然后维护一个节点与根节点的关系。这里find函数要注意递归的顺序要在关系维护之前,这样才能保证每次维护的节点的关系都是跟
根节点之间的关系。否则的话更新的关系可能只是当前节点和上一次的根节点之间的关系。
附一份我说的这种错误的代码。wa过无数次,就是这个地方没有注意到。感谢徐暾大神的支持。
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> #define max1 100010 using namespace std; int par[max1]; int ran[max1]; int find(int a) { int rt; if(par[a]!=a) { int tmp=par[a]; ran[a]=(ran[a]^ran[tmp]); par[a]=find(par[a]); } return par[a]; } void build(int a,int b) { //cout<<"here"<<endl; int fa=find(a); int fb=find(b); // if(fa!=fb) // { par[fa]=fb; ran[fa]=~(ran[b]^ran[a]); // } } int main() { int t; int n,m; char kind; int p1,p2; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m);getchar(); for(int i=0; i<=n; i++) { par[i]=i; ran[i]=0; } for(int i=1; i<=m; i++) { scanf("%c %d %d",&kind,&p1,&p2);getchar(); if(kind==‘D‘) { build(p1,p2); } else { if(n==2) printf("In different gangs.\n"); else if(find(p1)==find(p2)) { if(ran[p1]==ran[p2]) printf("In the same gang.\n"); else printf("In different gangs.\n"); } else printf("Not sure yet.\n"); } } } return 0; }
所以说并查集的路径压缩一定要先压缩在维护关系,不然会出现一些稀奇古怪的东西。
poj 1703 Find them, Catch them
原文:http://www.cnblogs.com/superxuezhazha/p/5335513.html