欧拉回路

题目描述:
    欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
输入:
    测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结束。
输出:
    每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。
样例输入:
3 3
1 2
1 3
2 3
3 2
1 2
2 3
0
样例输出:
1
0

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstdlib>
  4 #include <cstring>
  5 #include <cmath>
  6 #include <cctype>
  7 #include <vector>
  8 #include <list>
  9 #include <deque>
 10 #include <stack>
 11 #include <queue>
 12 #include <map>
 13 #include <set>
 14 #include <string>
 15 #include <algorithm>
 16 
 17 
 18 using namespace std;
 19 
 20 
 21 vector<int>vt[1000];
 22 
 23 int d[1000];
 24 int vis[1000];
 25 
 26 
 27 
 28 int bfs(int v)
 29 {
 30     vis[v]=1;
 31 
 32     queue<int>q;
 33     
 34     q.push(v);
 35     while(q.size())
 36     {
 37         int ans=q.front();
 38         q.pop();
 39 
 40         for(int i=0;i<vt[ans].size();i++)
 41         {
 42             if(vis[vt[ans][i]]==0)
 43             {
 44                 vis[vt[ans][i]]=1;
 45                 q.push(vt[ans][i]);
 46             }
 47         }
 48     }
 49     return 0;
 50 }
 51 
 52 
 53 
 54 int main()
 55 {
 56 
 57     int n,m;
 58     int i,j,k;
 59 
 60     while(scanf("%d",&n)!=EOF)
 61     {
 62         if(n==0)
 63             break;
 64 
 65         scanf("%d",&m);
 66 
 67         for(i=1;i<=n;i++)
 68         {d[i]=0;vt[i].clear();}
 69 
 70 
 71 
 72         for(i=0;i<m;i++)
 73         {
 74             int a,b;
 75             scanf("%d%d",&a,&b);
 76             vt[a].push_back(b);
 77             vt[b].push_back(a);
 78 
 79 
 80             d[a]++;
 81             d[b]++;
 82         }
 83 
 84     
 85         for(i=1;i<=n;i++)
 86             vis[i]=0;
 87         
 88 
 89         bfs(1);
 90 
 91         for(i=1;i<=n;i++)
 92             if(vis[i]==0)
 93                 break;
 94 
 95             if(i<=n)
 96             {
 97                 printf("0");
 98             
 99             }
100             else
101             {
102                 for(i=1;i<=n;i++)
103                     if(d[i]%2!=0)
104                         break;
105 
106                     if(i<=n)
107                     {
108                         printf("0");
109                     }
110                     else
111                         printf("1");
112             }
113 
114             puts("");
115     }
116 
117 
118 
119             
120 
121 
122 
123 
124     return 0;
125 }

 

posted @ 2012-05-30 20:33  cseriscser  阅读(224)  评论(0编辑  收藏  举报