对于无向图G,具有一条欧拉路(一笔画),当且仅当G是连通的,且有零个或两个奇数度结点。
代码:
#include<bits/stdc++.h> using namespace std; int par[1001]; int G[1001]; void init(int n) { for(int i=1;i<=n;i++) par[i]=i; } int find(int x) { if(x!=par[x]) par[x]=find(par[x]); return par[x]; } void union_(int x,int y) { x=find(x); y=find(y); if(x!=y) par[y]=x; } int main() { int N,n,m; scanf("%d",&N); while(N--) { memset(G,0,sizeof(G)); scanf("%d%d",&n,&m); init(n); int a,b; for(int i=1;i<=m;i++) { scanf("%d%d",&a,&b); union_(a,b); G[a]++; G[b]++; } int sum_root=0,sum_ji=0;//根结点的个数,记录奇度顶点个数 for(int i=1;i<=n;i++) { if(par[i]==i) sum_root++; if(G[i]&1) sum_ji++; } if(sum_root>1) { printf("No\n"); continue; } if(sum_ji==0||sum_ji==2) printf("Yes\n"); else printf("No\n"); } return 0; }