John's trip(poj 1041)

John's trip

题目大意: 给出无向图,每条边有唯一的序号,是否存在欧拉回路,若存在输出边序号最小字典序的路径。

下面代码没有判断图连通,根据题意图应该联通了,只需判断零个奇数点就可以了。

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

const int M=45;
const int N=1995;

int gra[M][N]; //gra[i][j]=k表示点x经过边j到达点k
int ind[M];
int ans[N]; 
bool vis[N];
int cnt;

void dfs(int s)
{
    for(int i=1;i<1995;i++)
      if(gra[s][i]&&!vis[i])
      {
          vis[i]=true;
          dfs(gra[s][i]);
          ans[cnt++]=i;
      }
}

int main()
{
    int u,v,w;
    while(scanf("%d%d",&u,&v))
    {
    	memset(gra,0,sizeof(gra));
        memset(ind,0,sizeof(ind));
        memset(vis,false,sizeof(vis));
        
        if(u==0&&v==0) break;
        int start=min(u,v);
        
        while(u!=0&&v!=0)
        {
            scanf("%d",&w);
            gra[u][w]=v;
            gra[v][w]=u;
            ind[u]=!ind[u]; 
            ind[v]=!ind[v];
            scanf("%d%d",&u,&v);
        }
        
        int flag=0;
        for(int k=1;k<M;k++)
            if(ind[k]) flag=1;
        if(flag)
        {
            puts("Round trip does not exist.");
            continue;
        }
        
        cnt=0;
		dfs(start);
        
        for(int i=cnt-1;i>=0;i--)
          printf("%d ",ans[i]);
        printf("\n");
    }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/m0_37846371/article/details/80329365
今日推荐