Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 18126 | Accepted: 5330 |
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.
此题的意思就是要吧嫌疑犯分成两个团伙。其实这道题就是求给的一个图是不是二分图。。。。
//CODE: POJ_1703 652K 516MS #include<iostream> using namespace std; int f[100010]; //相对于父节点的性质,true表示是同伙,false表示不是同伙 bool sex[100010]; //返回父节点,以及相对于父节点的性质 int find(int x,bool &se) { se=true; int r=x; while(x!=f[x]) { if(sex[x]==false) se=!se; x=f[x]; } //以下这两句没加之前超时,加了之后516MS,状态压缩的作用 f[r]=x; sex[r]=se; return x; } int main() { int t,i,n,m,a,b,cnt=1; scanf("%d",&t); char str[3]; while (t--) { scanf("%d%d",&n,&m); for(i=1;i<=n;i++) f[i]=i,sex[i]=true; bool judge=true; while(m--) { scanf("%s%d%d",str,&a,&b); bool l1=0,l2=0; //查询当前节点相对于父节点的性质 int fa=find(a,l1),fb=find(b,l2); if(str[0]=='D') { //合并两个集合 f[fa]=fb; //经观察,当2个节点相对于父节点的性质都是true或都是false时,两个父节点不是同伙,反之是同伙 sex[fa]=l1^l2; } else { if(fa==fb) //在同一个集合里就能确定两个犯人的相对属性 { if(l1==l2) //是同伙 printf("In the same gang.\n"); else printf("In different gangs.\n"); } else //不在同一个集合里无法确定 printf("Not sure yet.\n"); } } } return 0; }
//CODE POJ_2492 176K 735MS #include<iostream> using namespace std; int f[2012]; //相对于父节点的性别,true表示是同性,false表示异性 bool sex[2012]; int find(int x,bool &se) { se=true; int r=x; while(x!=f[x]) { if(sex[x]==false) se=!se; x=f[x]; } //以下这两句没加之前2016MS,加了之后735MS,状态压缩的作用 f[r]=x; sex[r]=se; return x; } int main() { int t,i,n,m,a,b,cnt=1; scanf("%d",&t); while (t--) { scanf("%d%d",&n,&m); for(i=1;i<=n;i++) f[i]=i,sex[i]=true; bool judge=true; while(m--) { scanf("%d%d",&a,&b); if(judge) //未异常 { bool l1=0,l2=0; //查询当前节点相对于父节点的性别 int fa=find(a,l1),fb=find(b,l2); if(fa==fb) { if(l1==l2) judge=false; } else { //合并两个集合 f[fa]=fb; //经观察,当2个节点相对于父节点的性质都是true或都是false时,两个父节点异性,反之是同性 sex[fa]=l1^l2; } } } printf("Scenario #%d:\n",cnt++); if(judge) printf("No suspicious bugs found!\n\n"); else printf("Suspicious bugs found!\n\n"); } return 0; }