POJ1041 John's trip 欧拉回路路径查找

来源:互联网 发布:淘宝图片如何ps 编辑:程序博客网 时间:2024/05/21 17:20

题目链接:http://poj.org/problem?id=1041


题目大意:一个城镇有n个二叉路口,这些路口由m条街道连接,某人想要从某个路口出发,经过所有的街道且每条街道只走一次,再回到出发点,让找出一个可行的路线,依次输出经过的街道编号,如果有多条路线,选择字典序最小的一条输出。


分析:经典的欧拉回路问题。因为是要输出街道编号,建图需要一些技巧。


实现代码如下:

#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到达点kint ind[M]; //每个节点的度int ans[N],cnt; //最佳方案bool vis[N]; //标记每条街道是否被访问int maxn; //纪录最大的街道编号void dfs(int s){    for(int i=1;i<=maxn;i++)      if(gra[s][i]&&!vis[i])      {          vis[i]=true;          dfs(gra[s][i]);          ans[cnt++]=i;      }}int main(){    int start;    int u,v,w;    while(scanf("%d%d",&u,&v))    {        if(u==0&&v==0) break;        start=min(u,v);        maxn=0;        cnt=0;        memset(gra,0,sizeof(gra));        memset(ind,0,sizeof(ind));        memset(vis,false,sizeof(vis));        while(u!=0&&v!=0)        {            scanf("%d",&w);            gra[u][w]=v;            gra[v][w]=u;            ind[u]=!ind[u]; //我们只需要纪录度数的奇偶性即可            ind[v]=!ind[v];            maxn=max(maxn,w);            scanf("%d%d",&u,&v);        }        int k=1;        for(;k<M;k++) //查找节点度数为偶数的点          if(ind[k]) break;        if(k<M)        {            puts("Round trip does not exist.");            continue;        }        dfs(start);        for(int i=cnt-1;i>=0;i--)          printf("%d ",ans[i]);        printf("\n");    }    return 0;}


0 0
原创粉丝点击