hrbeu 哈工程 Eular Graph

欧拉回路裸题,给定n个点和m条有向边,判断该图是否为欧拉回路

有向图欧拉回路判断条件有:图连通,所有点的度为偶数

 

代码一,用并查集来判断图是否连通,然后逐一扫描所有点的度是否为偶数

#include <stdio.h>

#include <string.h>

#define N 110

int n,m;

int d[N];

int p[N];



int find(int x)  //并查集

{ return p[x]==x ? x : find(p[x]); }

int main()

{

        int CASE,i,j,u,v,x,y,ok;

        scanf("%d",&CASE);

        while(CASE--)

        {

                scanf("%d%d",&n,&m);

                memset(d,0,sizeof(d));

                for(i=1; i<=n; i++) 

                        p[i]=i;



                for(i=1; i<=m; i++)

                {

                        scanf("%d%d",&u,&v);

                        d[u]++; 

                        d[v]++;

                        x=find(u);

                        y=find(v);

                        if(x!=y)

                                p[u]=v;

                }



//              for(i=1; i<=n; i++) printf("%d ",find(i)); printf("\n");



                for(ok=1,i=1 ;i<n; i++) 

                        if(find(i+1)!=find(i))

                        { ok=0; break;}



                if(!ok) { printf("no\n"); continue; }

                

                for(ok=1,i=1; i<=n; i++)

                        if((d[i]%2))

                        { ok=0; break;}



                if(ok) printf("yes\n");

                else   printf("no\n");

        }

        return 0;

}

 

代码二,直接用邻接矩阵来建图,然后dfs整个图看有多少个连通分量,当只有一个连通分量时说明图连通,然后再逐一判断所有点的度是否为偶数

#include <stdio.h>

#include <string.h>

#define N 110

bool g[N][N],vis[N];

int d[N];

int n,m;



void dfs(int i)

{

        int j;

        for(j=1; j<=n; j++) if( g[i][j] && !vis[j])

        { vis[j]=1; dfs(j); } 

}

int main()

{

        int T,i,u,v,count;

        scanf("%d",&T);

        while(T--)

        {

                scanf("%d%d",&n,&m);

                memset(g,0,sizeof(g));

                memset(vis,0,sizeof(vis));

                memset(d,0,sizeof(d));

                for(i=1; i<=m; i++)

                {

                        scanf("%d%d",&u,&v);

                        g[u][v]=1;

                        d[u]++;

                        d[v]++;

                }



                for(count=0,i=1; i<=n; i++) if(!vis[i])

                { ++count; vis[i]=1; dfs(i);}



                if(count>1) printf("no\n");

                else

                {

                        for(i=1; i<=n; i++) 

                                if( d[i]%2 )

                                        break;

                        if(i>n) printf("yes\n");

                        else    printf("no\n");

                }



        }

        return 0;

}

你可能感兴趣的:(Graph)