poj 2492A Bug's Life(并查集)

简介:
1 /*
 2 目大意:输入一个数t,表示测试组数。然后每组第一行两个数字n,m,n表示有n只昆虫,编号从1—n,m表示下面要输入m行交配情况,每行两个整数,表示这两个编号的昆虫为异性,要交配。
 3 要求统计交配过程中是否出现冲突,即是否有两个同性的昆虫发生交配。
 4 
 5 思路:并查集
 6    将同性的昆虫放入集合之中,如果输入的昆虫u, v同时出现在了集合中,那么 u,v就是同性的!发生了同性交配的可能!
 7 */
 8 
 9 #include <string>
10 #include <cstdio>
11 #include <cstring>
12 #include <iostream>
13 
14 
15 
16 using namespace std;
17 int n, m;
18 int f[2010];
19 int  mark[2010];//mark[i]表示 与 i 交配的昆虫的编号!
20 
21 int getFather(int x){
22    return x==f[x] ? x : f[x]=getFather(f[x]);
23 }
24 
25 void Union(int a, int b){
26     int fa=getFather(a), fb=getFather(b);
27     if(fa!=fb)
28        f[fa]=fb;
29 }
30 
31 int main(){
32    int t, cnt=0;
33    scanf("%d", &t);
34    while(t--){
35       
36           scanf("%d%d", &n, &m);
37           for(int i=1; i<=n; ++i)
38           f[i]=i;
39       memset(mark, 0, sizeof(mark));
40       int flag=1;
41       while(m--){
42              int u, v;
43          scanf("%d%d", &u, &v);
44          if(flag){
45             if(getFather(u) == getFather(v)){
46                flag=0;
47                            continue;
48              }   
49                         if(!mark[u] && !mark[v]){
50                    mark[u]=v;
51                    mark[v]=u;
52                  }
53                 else if(!mark[u]){
54                    mark[u]=v;
55                    Union(u, mark[v]); //如果v配对了,u没有配对,那么u和mark[v]就是同性昆虫,放入集合之中
56             }
57                  else if(!mark[v]){
58                    mark[v]=u;        
59                    Union(v,mark[u]);//,,,,,,
60                 }
61                else{ 
62                   Union(u, mark[v]);//如果之前u和v都已经配对,现在u和v进行配对, 那么u和mark[v]是同性, v和mark[u]是同性!
63               Union(v, mark[u]);
64                }
65          }
66       }
67       printf("Scenario #%d:\n",++cnt);
68         if (flag==1) 
69             printf("No suspicious bugs found!\n");
70         else
71             printf("Suspicious bugs found!\n");
72         printf("\n");
73    }
74 }









本文转自 小眼儿 博客园博客,原文链接:http://www.cnblogs.com/hujunzheng/p/3892002.html,如需转载请自行联系原作者
目录
相关文章
|
人工智能
poj 2299 Ultra-QuickSort 求逆序数 树状数组解法
所谓离散化,我们的了解就是对原数组排序,然后用所在位置的下标代替原数,这样我们就可以把数据范围缩小到1-500000,这个数组是开的下的。
57 0
poj 1088 记忆化搜索||动态规划
记忆化搜索也也是采用递归深搜的对数据进行搜索,但不同于直接深搜的方式,记忆化搜索是在每次搜索时将得到的结果保存下来,避免了重复计算,这就是所谓的记忆化。记忆化应该是属于动态规划。
44 0
|
机器学习/深度学习 存储
light oj 1011 - Marriage Ceremonies (状态压缩+记忆化搜索)
light oj 1011 - Marriage Ceremonies (状态压缩+记忆化搜索)
46 0
poj 2352 Stars 树状数组
树状数组,简单题,我刚刚开始学的时候就a了,不多说什么了,直接贴代码。
37 0
|
网络架构
POJ 3250 Bad Hair Day、POJ 2796 Feel Good(单调栈)
POJ 3250 Bad Hair Day、POJ 2796 Feel Good(单调栈)
POJ 3494 Largest Submatrix of All 1’s(单调栈)
POJ 3494 Largest Submatrix of All 1’s(单调栈)
POJ-2492,A Bug's Life(分类并查集)
POJ-2492,A Bug's Life(分类并查集)
td_
HDU_5952 Counting Cliques 深搜回溯
题意 HDU5952—16年沈阳E题给定一个无向图,输出图中节点个数为 s 的完全图的个数 思路 暴力深搜回溯,要点在于搜索时需要让当前点大于已经搜过的点,以此来去重,比如 1-3-5-4 这个完全图在之前必定可以搜出来 1-3-4-5,并且当前点要与之前的点保证有路,这样搜出来才是完全图做的时.
td_
1106 0