图算法10之1019
来源:互联网 发布:js隐藏class 编辑:程序博客网 时间:2024/04/28 04:35
1 题目编号:1019
2 题目内容:
23 31 22 31 34 21 23 4
Scenario #1:Suspicious bugs found!Scenario #2:No suspicious bugs found!
3 解题思路形成过程:首先所有昆虫应该属于两个集合,但是仅从每组输入,我们并不知道昆虫属于哪个集合,因此只能给他们各自一个集合,如果A B然后又有A C我们可以判断B与C属于一个集合,如果我们发现两个属于同一个集合,或者两个的对立集合是同一个集合,则两者同性,发生bug,不发生bug的两个发生关系,那么应该合并a和b的对立集合,b和a的对立集合
4 代码:
#include <iostream>
#include <stdio.h>
#include <map>
using namespace std;
const int M=2005;
map<int,int> uf; //昆虫所在集合
map<int,int> op; //昆虫对立性别所在集合
int find(int i)
{
if(i==uf[i])
return i;
return uf[i]=find(uf[i]);
}
void merge(int i,int j)
{
int t1=find(i);
int t2=find(j);
if(t1==t2)
return;
uf[t2]=t1;
merge(op[t2],op[t1]); //同时要合并对立集合
}
int main()
{
//freopen("1.in","r",stdin);
int n,m;
int t;
int co=1;
int i1,i2;
int f;
scanf("%d",&t);
while(t--)
{
f=0;
uf.clear();
op.clear();
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
{
scanf("%d%d",&i1,&i2);
if(f)
continue;
if(!uf[i1])
uf[i1]=i1;
if(!uf[i2])
uf[i2]=i2;
if(find(i1)==find(i2))
f=1;
else
{
int par1=find(i1);
int par2=find(i2);
if(!op[par1])
op[par1]=par2;
if(!op[par2])
op[par2]=par1;
if(find(op[par1])==find(op[par2]))
f=1;
else
{
merge(op[par1],i2);
merge(op[par2],i1);
}
}
}
printf("Scenario #%d:\n",co++);
if(f)
printf("Suspicious bugs found!\n\n");
else
printf("No suspicious bugs found!\n\n");
}
return 0;
}
- 图算法10之1019
- 算法导论之图算法
- 图之prim算法
- 图之kruskal算法
- 图之Dijkstra算法
- 数据结构算法之图
- 算法09 之图
- 图之Dijkstra算法
- 算法10 之带权图
- 【图算法之二分图匈牙利算法】
- 图算法12之图算法总结
- 算法之图搜索算法(一)
- 算法之图搜索算法(一)
- 算法之图搜索算法(一)
- 算法导论之图的基本算法
- 图算法之最短路径算法
- 10大算法之kmeans算法学习
- 搜索算法9之1019
- hdu 4638 Group(2013 Multi-University Training Contest 4)
- python中的深拷贝和浅拷贝理解
- 簡單SQLite 數據庫操作Demo
- 欢迎使用CSDN-markdown编辑器
- iOS 从应用中跳转至系统设置页面里的多种设置页面
- 图算法10之1019
- 【2030】排队打水问题
- 掌恒小例子
- 图算法11之1023
- jQuery动态增加删除li及事件绑定
- bower
- 使用了未经检查或不安全的操作……
- 如家小例子
- 硬件开发过程简介(一)