标签:des style blog color io os ar for strong
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 32225 | Accepted: 9947 |
Description
Input
Output
Sample Input
1 5 5 A 1 2 D 1 2 A 1 2 D 2 4 A 1 4
Sample Output
Not sure yet. In different gangs. In the same gang.
题目大意:N 表示共有 N 个帮派;下面有 M 条个询问
有两个帮派,现在告诉你一些互相敌对的点对,然后让你判断某两个点之间的关系首先判两个点关系是否确定;
只要两个点在一个集合里就可以了,直接用并查集然后判断同一个集合的关系:想了很久,发现只要转换到根,看看两个点和根的关系就可以了。
只要在结点间加上个权,1表示敌对,0相反。路径压缩和合并集合的时候考虑下权做下变换就可以了。加了个秩快了一点。
AC代码:
#include<iostream> #include<algorithm> #include<cstdio> using namespace std; // 0 代表木有关系,1代表同类,2代表不同类 const int N = 1e5+10; int m; int f[N],c[N]; int init() { for(int i=0; i<=m; i++) { f[i] = i; c[i] = 0; } } int xfind(int x) { if(f[x] == x) return x; int t = f[x]; f[x] =xfind(f[x]); c[x] = (c[x]+c[t])%2; return f[x]; } int solve(char ch,int x,int y ) { int fx = xfind(x); int fy = xfind(y); if(fx != fy) { if(ch == ‘A‘) return 0; //返回值 f[fx] =fy; if((c[x]+c[y])%2 ==0) c[fx] = 1; } else { if(ch == ‘A‘) { if(c[x] != c[y]) return 1; if(c[x] == c[y]) return 2; } } if(ch == ‘D‘) return 3; } int main( ) { int T,n,x,y; char s; scanf("%d",&T); while(T--) { scanf("%d %d",&m,&n); init(); for(int i=0; i<n; i++) { scanf(" %c %d %d",&s,&x,&y); int flag = solve(s,x,y); if(flag == 0) printf("Not sure yet.\n"); else if(flag == 1) printf("In different gangs.\n"); else if(flag == 2) printf("In the same gang.\n"); } } return 0; }
标签:des style blog color io os ar for strong
原文地址:http://www.cnblogs.com/lovychen/p/4044446.html