poj 2492 a bug's life 简单带权并查集

题意大致为找同性恋的虫子。。。。

这个比食物链要简单些。思路完全一致,利用取余操作实现关系之间的递推。

个人感觉利用向量,模和投影可能可以实现具有更加复杂关系的并查集。

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 const int MAXN=2010;
 5 int fa[MAXN];int rel[MAXN];    //rel[i]=0 代表与根节点同性,1代表异性
 6 void _set(int a)
 7 {
 8     for(int i=1;i<=a;i++)
 9     {
10         fa[i]=i;
11         rel[i]=0;
12     }
13 }
14 int _find(int a)
15 {
16     if(a==fa[a]) return fa[a];
17     int t=fa[a];
18     fa[a]=_find(fa[a]);
19     rel[a]=(rel[a]+rel[t])%2;
20     return fa[a];
21 }
22 void _union(int x, int y)
23 {
24     int fx=_find(x);
25    // int fy=_find(y);
26    // fa[x]=fy;
27     //rel[fx]=(1+rel[y]-rel[x]+2)%2;
28     fa[fx]=y;
29     rel[fx]=1-rel[x];
30 }
31 int main()
32 {
33    // freopen("in.txt","r",stdin);
34   //  freopen("out.txt","w",stdout);
35     int cases,flag,num,inter,x,y,fx,fy;
36     scanf("%d",&cases);
37     for(int i=1;i<=cases;i++)
38     {
39         scanf("%d %d",&num,&inter);
40         _set(num);
41         flag=0;
42         for(int j=1;j<=inter;j++)
43         {
44 
45             scanf("%d %d",&x,&y);
46             fx=_find(x);
47             fy=_find(y);
48             if(fx==fy)
49             {
50                 if(rel[x]==rel[y]) flag=1;
51             }
52             else _union(x,y);
53 
54         }
55         printf("Scenario #%d:\n",i);
56         if(flag)
57         printf("Suspicious bugs found!\n");
58         else printf("No suspicious bugs found!\n");
59         printf("\n");
60     }
61 
62     return 0;
63 }
View Code

 

posted on 2017-05-28 22:00  缄默火  阅读(109)  评论(0编辑  收藏  举报

导航