复习一下欧拉回路的求法。

伪代码如下:

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.