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 }