无向图判断欧拉路径只要:
1.图为连通图(并查集处理)
2.奇数度为0或2
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<string> 6 #include<queue> 7 #include<algorithm> 8 #include<map> 9 #include<iomanip> 10 #include<climits> 11 #include<string.h> 12 #include<cmath> 13 #include<stdlib.h> 14 #include<vector> 15 #include<stack> 16 #include<set> 17 using namespace std; 18 #define INF 1000000007 19 #define MAXN 4010 20 #define Mod 1000007 21 #define N 100010 22 #define NN 30 23 #define sigma_size 3 24 const int MAX = 1000100; 25 const int maxn = 6e5 + 10; 26 using namespace std; 27 typedef long long LL; 28 29 30 int T; 31 int n, m; 32 int u, v; 33 int fa[1111]; 34 int deg[1111], one, tot; 35 36 int findset(int x) 37 { 38 if (fa[x] == x) return x; 39 return fa[x] = findset(fa[x]); 40 } 41 42 void merg(int a, int b) 43 { 44 int x = findset(a); 45 int y = findset(b); 46 if (x != y) { 47 fa[x] = y; 48 } 49 } 50 int main() 51 { 52 scanf("%d",&T); 53 while (T--) { 54 cin >> n >> m; 55 one = 0, tot = 0; 56 for (int i = 0; i <= n; ++i) { 57 fa[i] = i; 58 } 59 memset(deg,0,sizeof(deg)); 60 for (int i = 0; i < m; ++i) { 61 scanf("%d%d", &u, &v); 62 deg[v]++, deg[u]++; 63 merg(u,v); 64 } 65 for (int i = 1; i <= n; ++i) { 66 if (deg[i] & 1) one++; 67 if (fa[i] == i) tot++; 68 } 69 if (tot == 1 && (one == 0 || one == 2)) 70 puts("Yes"); 71 else 72 puts("No"); 73 } 74 //system("pause"); 75 return 0; 76 }