求欧拉回路,这次不同的是求边的标号 这题需要正向输出边,所以要先用一个栈把边保存下来,或者将边逆向保存,直接输出 代码: #include<iostream> #include<cstdio> #include<memory.h> #include<algorithm> using namespace std; const int MAX=2005; struct node { int v,op,next,vis,id; }g[MAX*10]; int adj[MAX],e,degree[MAX],res[MAX],cnt; void add(int u,int v,int id) { g[e].v=v; g[e].vis=0; g[e].op=e+1; g[e].id=id; g[e].next=adj[u]; adj[u]=e++; g[e].v=u; g[e].vis=0; g[e].op=e-1; g[e].id=id; g[e].next=adj[v]; adj[v]=e++; } int max(int a,int b) { return a>b?a:b; } /* struct node { int x,y,vis; }street[MAX]; int edge,cnt,res[MAX],degree[MAX]; int max(int a,int b) { return a>b?a:b; } void eular(int u) { for(int i=1;i<=edge;i++) { if(!street[i].vis&&(street[i].x==u||street[i].y==u)) { //cout<<i<<endl; street[i].vis=1; eular(street[i].x+street[i].y-u); res[cnt++]=i; } } } */ void dfs(int u) { for(int i=adj[u];i!=-1;i=g[i].next) { if(!g[i].vis) { //printf("%d ",g[i].id); //res[cnt++]=g[i].id; g[i].vis=1; g[g[i].op].vis=1; dfs(g[i].v); printf("%d ",g[i].id); } } } int main() { int i,j,k,start,ii,jj,maxx; while(scanf("%d%d",&i,&j)!=EOF) { if(i==0&&j==0) break; start=i<j?i:j; e=cnt=0; maxx=-1; memset(adj,-1,sizeof(adj)); memset(degree,0,sizeof(degree)); degree[i]++; degree[j]++; scanf("%d",&k); add(i,j,k); maxx=max(maxx,max(i,j)); while(true) { scanf("%d%d",&i,&j); //cout<<i<<" "<<j<<endl; if(i==0&&j==0) break; degree[i]++; degree[j]++; scanf("%d",&k); add(i,j,k); maxx=max(maxx,max(i,j)); } j=k=0; for(i=1;i<=maxx;i++) { if(degree[i]&1) k++; } //cout<<j<<k<<endl; if(k>0) printf("Round trip does not exist."); else { dfs(start); //eular(start); } cout<<endl; } return 0; }