PAT甲题题解-1126. Eulerian Path (25)-欧拉回路+并查集判断图的连通性
题目已经告诉如何判断欧拉回路了,剩下的有一点要注意,可能图本身并不连通。
所以这里用并查集来判断图的联通性。
#include <iostream> #include <cstdio> #include <algorithm> #include <string.h> #include <string> using namespace std; /* 并查集用来判断图的联通性,有一组样例图是不连通的。。。 */ const int maxn=505; int degree[505]; struct UF{ int father[maxn]; void init(){ for(int i=0;i<maxn;i++){ father[i]=i; } } int find_root(int x){ if(father[x]!=x) father[x]=find_root(father[x]); return father[x]; } void Union(int x,int y){ int fx=find_root(x); int fy=find_root(y); if(fx!=fy) father[fx]=fy; } }uf; int main() { int n,m; int a,b; uf.init(); scanf("%d %d",&n,&m); for(int i=0;i<m;i++){ scanf("%d %d",&a,&b); degree[a]++; degree[b]++; uf.Union(a,b); } int vis[maxn]; memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++){ int fa=uf.find_root(i); vis[fa]=1; } int graphs=0; for(int i=1;i<=n;i++){ if(vis[i]){ graphs++; } } int sum=0; int cnt=0; for(int i=1;i<=n;i++){ if(i==1) printf("%d",degree[i]); else printf(" %d",degree[i]); sum+=degree[i]; if(degree[i]%2){ cnt++; } } printf("\n"); if(sum%2 || graphs>1){ printf("Non-Eulerian\n"); } else{ if(cnt==0) printf("Eulerian\n"); else if(cnt==2) printf("Semi-Eulerian\n"); else printf("Non-Eulerian\n"); } return 0; }