Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 46119 | Accepted: 14193 |
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.
Source
/* * @Author: Lyucheng * @Date: 2017-07-20 20:33:57 * @Last Modified by: Lyucheng * @Last Modified time: 2017-07-20 22:12:50 */ /* 题意:有两个帮派,两种操作: D x,y x和y是属于两个不同的帮派的 A x,y 询问x和y的关系 思路:二分染色问题,按照关系建边,如果x,y不在一个联通分量中的话就不能确定关系,如果在一个连通分量重 那么直接判断与根节点的距离的奇偶 */ #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <math.h> #include <stdlib.h> #include <time.h> #define MAXN 100005 using namespace std; int t; int n,m; char str[2]; int x,y; int bin[MAXN]; int cnt[MAXN];//节点到根结点的距离的奇偶 int findx(int x){ int cur=x; int s=0; while(x!=bin[x]){ if(cnt[x]==1){ s++; } x=bin[x]; } bin[cur]=x; cnt[cur]=s%2; return x; } void Union(int x,int y){ int fx=findx(x); int fy=findx(y); if(fx!=fy){//不在一个集合内的才合并 bin[fy]=fx; if(cnt[y]==0&&cnt[x]==0) cnt[fy]=1; else if(cnt[y]==0&&cnt[x]==1) cnt[fy]=0; else if(cnt[y]==1&&cnt[x]==0) cnt[fy]=0; else if(cnt[y]==1&&cnt[x]==1) cnt[fy]=1; } } void init(){ for(int i=0;i<=n;i++){ bin[i]=i; } memset(cnt,0,sizeof cnt); } int main(){ // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d",&t); while(t--){ scanf("%d%d",&n,&m); init(); for(int i=0;i<m;i++){ scanf("%s%d%d",str,&x,&y); if(str[0]==‘A‘){//询问 int fx=findx(x); int fy=findx(y); if(fx!=fy){ puts("Not sure yet."); }else{ if(cnt[x]==cnt[y]){ puts("In the same gang."); }else{ puts("In different gangs."); } } }else{//关系 Union(x,y); } } } return 0; }
poj 1703 Find them, Catch them
原文:http://www.cnblogs.com/wuwangchuxin0924/p/7214804.html