[关闭]
@lunar 2016-07-06T07:42:10.000000Z 字数 1230 阅读 1305

Hiho一下 二分图1 Week33

HiHo


描述

简单的讲是这样,有个人开了个婚介所,然后呢,有n个人报名,他就点鸳鸯谱嘛(把两个编号的人安排相亲),结果点的太多他怕有疏漏然后把同性给安排了。所以现在给你n个人(不知道男女),和m对相亲关系,判断他的安排对不对,对的话就输出Correct否则就输出Wrong。

输入

第1行:1个正整数T(1≤T≤10)
接下来T组数据,每组数据按照以下格式给出:
第1行:2个正整数N,M(1≤N≤10,000,1≤M≤40,000)
第2..M+1行:每行两个整数u,v表示u和v之间有一条边

输出

第1..T行:第i行表示第i组数据是否有误。如果是正确的数据输出”Correct”,否则输出”Wrong”

样例输入

  1. 2
  2. 5 5
  3. 1 2
  4. 1 3
  5. 3 4
  6. 5 2
  7. 1 5
  8. 5 5
  9. 1 2
  10. 1 3
  11. 3 4
  12. 5 2
  13. 3 5

样例输出

  1. Wrong
  2. Correct

思路

直接DFS就好了,选定一个点作为初始点,将其染色,入队列。每次从队列中取出点,遍历其相连的点,如未染色,则染上与该点不同的颜色,并如队列;若已经染色且二者同色,就说明两个人是gay嘛,那就报错。如果队列空了,那看看有没有还没有染色的点,有的话就入列重复以上操作(防止图不联通),没有的话就输出'Correct'。

代码

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<vector>
  4. #include<queue>
  5. using namespace std;
  6. typedef vector<int> vint;
  7. int n,m;
  8. void solve(){
  9. cin >> n >> m;
  10. vector <vint> G(n+1);
  11. short color[10001];
  12. for(int i=0;i<=n+1;i++) color[i] = 2;
  13. queue <int> q;
  14. int a,b;
  15. while(m--){
  16. scanf("%d%d",&a,&b);
  17. G[a].push_back(b);
  18. G[b].push_back(a);
  19. }
  20. color[1]=0;
  21. q.push(1);
  22. bool flag = true;
  23. while(flag){
  24. while(!q.empty()){
  25. int t = q.front();
  26. q.pop();
  27. for (int i=0;i<G[t].size();i++){
  28. if(color[G[t][i]]==2){
  29. q.push(G[t][i]);
  30. color[G[t][i]] = !color[t];
  31. }else {
  32. if(color[G[t][i]]==color[t]){
  33. cout << "Wrong"<<endl;
  34. return;
  35. }
  36. }
  37. }
  38. }
  39. flag = false;
  40. for(int i=1;i<=n;i++)
  41. if(color[i]==2){
  42. color[i] = 0;
  43. q.push(i);
  44. flag = true;
  45. break;
  46. }
  47. }
  48. cout<< "Correct"<<endl;
  49. return;
  50. }
  51. int main(){
  52. int iter;
  53. cin >> iter;
  54. while(iter--)solve();
  55. return 0;
  56. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注