HRBUST 1351 欧拉路径及回路的判断~

来源:互联网 发布:天龙八部清风怡江美工 编辑:程序博客网 时间:2024/06/05 11:16

给出一个无向图,n个顶点m条边。

然后m条边的信息,a b  表示ab之间有一条边

如果存在欧拉路径,输出“have Euler path”,如果存在欧拉回路,输出“have Euler Circuit“,
如果原图不连通,输出”Graph is not connected!“,否则输出”have no Euler path“。

判断欧拉路是否存在的方法
有向图:图连通,有一个顶点出度大入度1,有一个顶点入度大出度1,其余都是出度=入度。
无向图:图连通,只有两个顶点是奇数度,其余都是偶数度的。
判断欧拉回路是否存在的方法
有向图:图连通,所有的顶点出度=入度。
无向图:图连通,所有顶点都是偶数度。

记录每条边的信息,统计每个顶点的度数,用tot记录度数为奇数的顶点的个数,并查集判断是否联通,flag 记录集合的总数.

然后按照要求输出即可~

#include<stdio.h>#include<string.h>using namespace std;int f[1005];int ang[1005];int getfather(int x){    if(f[x]!=x)f[x]=getfather(f[x]);    return f[x];}void bing(int st,int ed){    int f1=getfather(st),f2=getfather(ed);    if(f1!=f2)f[f1]=f2;}int main(){    int t,st,ed,n,m;    while( scanf("%d %d",&n,&m)!=EOF){        for(int i=1;i<=100;i++){            ang[i]=0,f[i]=i;        }        for(int i=1;i<=m;i++){            scanf("%d %d",&st,&ed);            ang[st]++,ang[ed]++;            bing(st,ed);        }        int tot=0,flag=0,tp=-1;        for(int i=1;i<=n;i++){            if(ang[i]%2==1)tot++;            if(getfather(i)!=tp){                tp=getfather(i),flag++;            }        }        if(flag==1&&tot==0){            printf("have Euler Circuit\n");continue;        }        if(flag==1&&tot==2){            printf("have Euler path\n");continue;        }        if(flag!=1){            printf("Graph is not connected!\n");continue;        }        printf("have no Euler path\n");    }    return 0;}




原创粉丝点击