您的位置:首页 > 其它

POJ 1041 - John's trip

2013-03-29 11:09 344 查看
第一次写欧拉回路,哭了
#include <iostream>
#include <cstdio>
#include <memory.h>
#include <algorithm>
#include <vector>
using namespace std;
#define MAXSTREET 2000
#define MAXJUNC 50
int path[MAXSTREET],dg[MAXJUNC],pNum,maxj;

struct Edge{
int v,num,deleted;
Edge *next;
Edge(int vv=0,int nnum=0,Edge * nn=NULL):v(vv),num(nnum),next(nn),deleted(0){}
}g[MAXJUNC];

void addEdge(int u,int v,int s){
Edge *next=g[u].next,*pre=&g[u];
while(next&&s>next->num){
pre=next;
next=next->next;
}
pre->next=new Edge(v,s);
pre->next->next=next;
}
Edge * deleteEdge(int u,int s){
Edge *ne=g[u].next,*pre=&g[u];
while(ne&&ne->num!=s){
pre=ne;
ne=ne->next;
}
ne->deleted=1;
pre->next=ne->next;
return ne->next;
}
void clear(){
maxj=0;
pNum=0;
memset(dg,0,sizeof(dg));
memset(g,0,sizeof(g));
}
void euler(int cur,int edgeN){
Edge *ne=g[cur].next;
while (ne&&!ne->deleted)
{
int t=ne->num,ni=ne->v;
ne=deleteEdge(cur,t);//将边删除
deleteEdge(ni,t);    //无向图,反向也要删除
euler(ni,t);
}
path[pNum++]=edgeN;
}
int main(){
int x,y,s;
while (scanf("%d%d",&x,&y)&&x&&y)
{
clear();
scanf("%d",&s);
addEdge(x,y,s);
addEdge(y,x,s);
if(x>maxj)maxj=x;
if(y>maxj)maxj=y;
dg[y]++;
dg[x]++;
int oddCnt=0,evenCnt=0;
while(scanf("%d%d",&x,&y)&&x&&y){
scanf("%d",&s);
addEdge(x,y,s);
addEdge(y,x,s);
dg[y]++;
dg[x]++;
if(x>maxj)maxj=x;
if(y>maxj)maxj=y;
}
for (int i=0;i<=maxj;++i)
{
if(dg[i]&1)oddCnt++;
else evenCnt++;
}
if(oddCnt){
printf("Round trip does not exist.\n");
continue;;
}else{
euler(1,-1);
for(int i=pNum-2;i>=0;--i){
if(i!=pNum-2)printf(" ");
printf("%d",path[i]);
}
printf("\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: