最近一直在做裸题练习…今天来一个欧拉回路。 欧拉回路的存在性判断就是看任意顶点的度数是不是均为偶数(对于有向图出入度相等)。寻找欧拉回路时使用套圈算法即可。 program john_trip; const maxn=2000; maxm=1000000; msg='Round trip does not exist.'; type pointer=^node; node=record x,y,data:longint; next:pointer; end; var ans:array[0..maxm] of longint; edge:array[0..maxn,0..maxn] of pointer; g:array[0..maxn,0..maxn] of longint; deg:array[0..maxn] of longint; a,b,w,tot:longint; procedure prework; var i,j:longint; begin tot:=0; fillchar(deg,sizeof(deg),0); fillchar(g,sizeof(g),0); for i:=1 to maxn do for j:=1 to i do edge[i,j]:=nil; end; procedure swap(var a,b:longint); var t:longint; begin t:=a; a:=b; b:=t; end; procedure makeedge(a,b,w:longint); var p:pointer; begin if a>b then swap(a,b); new(p); p^.x:=a; p^.y:=b; p^.data:=w; p^.next:=edge[a,b]; edge[a,b]:=p; inc(deg[a]); inc(deg[b]); inc(g[a,b]); end; procedure init; begin while (a<>0) and (b<>0) do begin readln(w); makeedge(a,b,w); read(a,b); end; end; function check:boolean; var i:longint; begin for i:=1 to maxn do if odd(deg[i]) then begin writeln(msg); exit(false); end; exit(true); end; procedure euler(x:longint); var i:longint; begin if deg[x]<>0 then begin for i:=1 to x do if g[i,x]>0 then begin dec(g[i,x]); dec(deg[i]); dec(deg[x]); euler(i); end; for i:=x+1 to maxn do if g[x,i]>0 then begin dec(g[x,i]); dec(deg[x]); dec(deg[i]); euler(i); end; end; inc(tot); ans[tot]:=x; end; procedure outit; var i:longint; begin for i:=2 to tot-1 do begin a:=ans[i]; b:=ans[i-1]; if a>b then swap(a,b); write(edge[a,b]^.data,' '); edge[a,b]:=edge[a,b]^.next; end; a:=ans[tot]; b:=ans[tot-1]; if a>b then swap(a,b); writeln(edge[a,b]^.data); end; procedure bigmain; begin read(a,b); while (a<>0) and (b<>0) do begin prework; init; if check then begin euler(1); outit; end; read(a,b); end; end; begin assign(input,'a.in'); reset(input); assign(output,'a.out'); rewrite(output); bigmain; close(input); close(output); end.