复习一下欧拉回路的求法。
伪代码如下:
Void Eular(int p); { for 从p出发的每条边 { 如果这条边没有被访问过 { 边的访问标记置为 true Eular(这条边上另外一个点); 将这条边压入栈中; } } }
倒序访问栈中每一条边就是答案。
CODE
Program POJ2230;//By_Poetshy Const maxn=10000; maxm=50000; Var i,j,k,m,n,p,q :Longint; pre,other,last :Array[1..maxm*2]of Longint; v :Array[1..maxm*2]of Boolean; ans :Array[0..maxm*3]of Longint; Procedure Eular(p:Longint); var j,k:Longint; begin j:=last[p]; while j<>0 do begin if not v[j] then begin v[j]:=true; k:=other[j]; Eular(k); inc(ans[0]); ans[ans[0]]:=j; end; j:=pre[j]; end; end; BEGIN readln(n,m); for i:=1 to m do begin readln(p,q); inc(k);pre[k]:=last[p];last[p]:=k;other[k]:=q; inc(k);pre[k]:=last[q];last[q]:=k;other[k]:=p; end; fillchar(v,sizeof(v),0); Eular(1); writeln(1); while ans[0]<>0 do begin writeln(other[ans[ans[0]]]); dec(ans[0]); end; END.