Fellow me on GitHub

HDU1878(欧拉回路)

欧拉回路

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 13288    Accepted Submission(s): 4956


Problem Description

欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
 

 

Input 

测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结
束。
 

 

Output

每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。
 

 

Sample Input

3 3
1 2
1 3
2 3
3 2
1 2
2 3
0
 

 

Sample Output

1
0
 
计算每一个节点的度,必须为偶数,用并查集判断图是否连通,好挫的n2写法啊。。。
 1 //2016.9.18
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstring>
 5 #define N 1005
 6 
 7 using namespace std;
 8 
 9 int G[N][N], vis[N][N], n, m, fa[N];
10 
11 void init(int n)
12 {
13     for(int i = 1; i <= n; i++)
14           fa[i] = i;
15 }
16 
17 int getfa(int a)
18 {
19     if(fa[a] == a)return a;
20     return fa[a] = getfa(fa[a]);
21 }
22 
23 int Merge(int a, int b)
24 {
25     int af = getfa(a);
26     int bf = getfa(b);
27     if(af!=bf)fa[bf] = af;
28 }
29 
30 int main()
31 {
32     int u, v;
33     while(scanf("%d", &n)!=EOF && n)
34     {
35         scanf("%d", &m);
36         memset(G, -1, sizeof(G));
37         init(n);
38         for(int i = 0; i < m; i++)
39         {
40             scanf("%d%d", &u, &v);
41             G[u][v] = G[v][u] = 1;
42             Merge(u, v);
43         }
44         int cnt = 0;
45         for(int i = 1; i <= n; i++)//所有节点的度必须为偶数
46         {
47             int idx = 0;
48             for(int j = 1; j <= n; j++)
49             {
50                 if(i == j)continue;
51                 if(G[i][j]==1)idx++;
52             }
53             if(idx&1)cnt++;
54             if(cnt > 0)break;
55         }
56         bool fg = true;
57         int ct = 0;
58         for(int i = 1; i <= n; i++)//判断图是否连通
59         {
60             if(fa[i]==i)ct++;
61             if(ct>1){
62                 fg = false;
63                 break;
64             }
65         }
66         if(cnt == 0 && fg)printf("1\n");
67         else printf("0\n");
68     }
69 
70     return 0;
71 }

 

 
posted @ 2016-09-18 22:09  Penn000  阅读(251)  评论(0编辑  收藏  举报