John's trip 欧拉回路输出路径

来源:互联网 发布:中文域名的作用 编辑:程序博客网 时间:2024/06/08 09:39
/*欧拉回路和欧拉路径的判断欧拉回路:无向图:每个顶点的度数都是偶数,则存在欧拉回路。有向图:每个顶点的入度都等于出度,则存在欧拉回路。欧拉路径:无向图:当且仅当该图所有顶点的度数为偶数 或者 除了两个度数为奇数外其余的全是偶数。有向图:当且仅当该图所有顶点 出度=入度 或者 一个顶点 出度=入度+1,另一个顶点 入度=出度+1,其 他顶点 出度=入度。*//*用 g[u][e]=v;        g[v][e]=u;的方法将点对应的边记录下来。深搜的时候直接输出。很巧妙啊。*/#include <stdio.h>#include <cstring>#include <iostream>using namespace std;int g[50][2000];int vis[2000];int degree[50];int stack[2000];int top;void erlu(int u,int m){    for(int i=1;i<=m;i++)    {        if(!vis[i]&&g[u][i])        {            vis[i]=true;            erlu(g[u][i],m);            stack[top++]=i;        }    }}int main(){    int u,v,e,n,m,s;    while(scanf("%d%d",&u,&v)==2)    {        if(u==0&&v==0) break;        n=0;        m=0;        top=1;        memset(degree,0,sizeof(degree));        memset(vis,false,sizeof(vis));        memset(g,0,sizeof(g));        scanf("%d",&e);        n=max(n,max(u,v));        m=max(m,e);        s=min(u,v);        degree[u]++;        degree[v]++;        g[u][e]=v;        g[v][e]=u;        while(scanf("%d%d",&u,&v)==2)        {            if(u==0&&v==0) break;            scanf("%d",&e);            n=max(n,max(u,v));            m=max(m,e);            degree[u]++;            degree[v]++;            g[u][e]=v;            g[v][e]=u;        }        bool ret=false;        for(int i=1;i<=n;i++)        {            if(degree[i]%2==1) ret=true;        }        if(ret) printf("Round trip does not exist.\n");        else        {            erlu(s,m);            printf("%d",stack[top-1]);            for(int i=top-2;i>=1;i--)            printf(" %d",stack[i]);            printf("\n");        }    }    return 0;} 


	
				
		
原创粉丝点击