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;
}
View Code

 

posted @ 2017-03-05 20:03  辰曦~文若  阅读(624)  评论(0编辑  收藏  举报