Time Limit: 10000MS | Memory Limit: 65536K | |
Total Submissions: 32828 | Accepted: 10751 |
Description
Input
Output
Sample Input
2 3 3 1 2 2 3 1 3 4 2 1 2 3 4
Sample Output
Scenario #1: Suspicious bugs found! Scenario #2: No suspicious bugs found!
Hint
题目大意:有n只虫子,m个关系,关系表示x,y有性关系,如果有同性恋,输出 found,否则输出no found、
思路:m个关系表示是假设x,y这两个人是异性,如果有冲突,表示有同性恋,其实也就是说,不满足二分图。如果有不冲突,那么一个集合全是男的 ,一个集合全是女的,只有在两个集合之间有性关系,集合内是不应该有关系的,所以我们这里采用二分图染色的方法来搞定。
简单点说二分法就是对于这样的样例:
1 2
2 3
假设1是黑色,2是红色,3也是黑色,那么13同性 ,2与13异性,没有同性恋。
1 2
2 3
3 1
假设1是和黑色,那么2就是红色,通过2是红色,我们规定3是黑色,遍历3的时候,3和1同色,冲突,不满足二分图,即有同性恋。
AC代码:
#include<stdio.h> #include<string.h> #include<vector> #include<queue> using namespace std; int f[1000005]; int color[1000005]; vector<int >map[1000005]; int bfs(int x) { queue<int >s; s.push(x); if(color[x]==0)//这里也要注意,如果人家原先有颜色,千万不要覆盖他的颜色。 color[x]=1; while(!s.empty()) { int u=s.front(); s.pop(); for(int i=0;i<map[u].size();i++) { int v=map[u][i]; if(color[v])//如果v有颜色 { if(color[v]==color[u])//判断是否冲突 { return 0; } } else//如果v没有颜色 { color[v]=3-color[u];//标记上于u相反的颜色 s.push(v); } } } return 1; } int main() { int t; int kase=0; scanf("%d",&t); while(t--) { memset(color,0,sizeof(color)); int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { f[i]=i; map[i].clear(); } for(int i=0;i<m;i++) { int x,y; scanf("%d%d",&x,&y); map[x].push_back(y);//首先这是个无向图,不要缺少条件。 map[y].push_back(x); } int flag=0; for(int i=1;i<=n;i++)//遍历所有人、 { if(bfs(i)==0) { flag=1; break; } } printf("Scenario #%d:\n",++kase); if(flag==1) { printf("Suspicious bugs found!\n"); } else { printf("No suspicious bugs found!\n"); } puts(""); } }