Hdu1829 并查集+广度优先搜索
来源:互联网 发布:数控冲床编程难不难 编辑:程序博客网 时间:2024/06/15 19:38
....WA了我N次........
题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1829
题目大意是这样:给你多组"bug"和"bug"之间的关系(我理解为交配关系...),让你查看这些"bug"里面有没有同性恋.
好吧还是用测试数据来解释吧.
2
3 3
1 2
2 3
1 3
4 2
1 2
3 4
先看红色的测试数据:有三个"bug"其中1---2 2----3 1---3 有关系,但是这里有一个矛盾就是
假如1为雄性则2为雌性3为雄性,但是第三组数据可以看出1和3之间是"同性恋"...
而第二组测试数据则完全正常
1----2 3----4 符合要求.
题意理解了就好了.不过一开始想用深搜但是超时,换成广搜就好多了.
首先将有关系的:"bug"的编号利用并查集处理这样在广搜的时候可以将"独立"的元素送入队列中,我数字1代表雄性 2代表雌性
"独立"的元素看成雄性.
还是以第三组数据为例: 在利用并查集处理之后.
group[1] = 2; group[2] = 3;group[3] = 3;
这样广搜的时候 3 最先送入队列.
根据事先建立的关系图.
3------1 3为雄性 1为雌性
1------2 1为雌性 2为雄性
2------3 2为雄性 3为雄性!!!!!好矛盾出现了.
所以这时候程序返回值说明这一组"bug"里面有同性恋.
#include <iostream>#include <queue>#include <algorithm>#include <cstring>using namespace std;int x,y;bool maps[2001][2001];int sex[2001];int group[2001];void init(){int i;for(i=1;i<=x;i++)group[i]=i;}int Find(int z){int i,f=z;while(f!=group[f])f=group[f]; //这一段老实说是网上看到的,因为没有这一段运行时间会长一些 while(z!=f){i=group[z];group[z]=f;z=i;}return f;}int bfs(){int i,t;queue<int>q;for(i=1;i<=x;i++){if(i==group[i]){sex[i]=1;q.push(i);}}while(!q.empty()){t=q.front();q.pop();for(i=1;i<=x;i++){if(maps[t][i]){if(sex[i]==0){if(sex[t]==1)sex[i]=2;else if(sex[t]==2)sex[i]=1;q.push(i);}else{if(sex[t] == sex[i])return 1;}}}}return 0;}int main(){int i,n;int cx,cy,count;scanf("%d",&n);count=1;for(count=1;count<=n;count++){memset(sex,0,sizeof(sex));memset(maps,0,sizeof(maps));scanf("%d%d",&x,&y);init();for(i=0;i<y;i++){scanf("%d%d",&cx,&cy);maps[cx][cy]=maps[cy][cx]=1;if(Find(cx)!=Find(cy)){group[Find(cx)] = Find(cy);}}if(bfs()){printf("Scenario #%d:\n",count);printf("Suspicious bugs found!\n\n");}else{printf("Scenario #%d:\n",count);printf("No suspicious bugs found!\n\n");}}return 0;}
- Hdu1829 并查集+广度优先搜索
- hdu1829并查集
- hdu1829 并查集
- hdu1829(并查集)
- HDU1829【种类并查集】
- HDU 1829 A Bug's Life (并查集+BFS(广度优先搜索))
- hdu1829(种类并查集)
- HDU1829 A Bug's Life 并查集
- HDU1829(A Bug's Life )—并查集
- A Bug's Life hdu1829 并查集
- A Bug's Life(hdu1829种类并查集)
- hdu1829 A Bug's Life (并查集)
- hdu1829 A Bug's Life 并查集
- hdu1829 A Bug's Life(并查集)
- HDU1829 - A Bug's Life 分组并查集
- POJ1182食物链,HDU1829(种类并查集)
- hdu1829 A Bug's Life --分组并查集
- HDU1829:A Bug's Life(并查集)
- 【Q&A】stl容器去除重复的元素
- wishbone
- 数据结构面试之八——图的常见操作2之最短路径
- iOS开发:安装真机调试证书
- 励志语句,简短有道理
- Hdu1829 并查集+广度优先搜索
- 设置网卡混杂模式
- C++引用类型
- i++与++i的区别
- Java多态分析
- 数据结构面试之九——图的常见操作3之最小生成树
- 二叉树 和 游戏
- 从头开始构建一个web即时通讯系统 - 基础 - web即时通讯系统的四种实现
- 我的java笔记(网络编程)