Analysis
这道题就是求一个图的哈密顿回路,给定的条件满足Ore性质,那么用《组合数学》上的构造方法来构造就可以了。
Accepted Code
var
map:array[1..1000,1..1000] of boolean;
used:array[1..1000] of boolean;
chain,tmpchain:array[1..1000] of longint;
bo:boolean;
c:char;
i,j,t,n,l,r,k,tmp:longint;
procedure print;
var
i,l:longint;
begin
for l:=1 to n do
if chain[l]=1 then
break;
for i:=l to n do
write(chain[i],' ');
for i:=1 to l-1 do
write(chain[i],' ');
writeln(1);
end;
procedure reverse(i,j:longint);
var
l:longint;
begin
move(chain[i],tmpchain[1],(j-i+1)*sizeof(longint));
for l:=i to j do
chain[l]:=tmpchain[j-l+1];
end;
begin
readln(n);
for i:=1 to n do
repeat
read(t);
map[i,t]:=true;
map[t,i]:=true;
read(c);
until c<>' ';
fillchar(used,sizeof(used),false);
chain[1]:=1;
used[1]:=true;
t:=1;
while t<n do
begin
for l:=1 to 2 do
begin
repeat
bo:=true;
for i:=1 to n do
if not used[i] and map[chain[t],i] then
begin
inc(t);
chain[t]:=i;
used[i]:=true;
bo:=false;
break;
end;
until bo;
reverse(1,t);
end;
for i:=1 to t-1 do
if map[chain[1],chain[i+1]] and map[chain[i],chain[t]] then
begin
reverse(i+1,t);
break;
end;
for i:=1 to n do
if not used[i] then
begin
bo:=false;
for l:=1 to t do
if map[i,chain[l]] then
begin
move(chain[1],tmpchain[1],l*sizeof(longint));
move(chain[l+1],chain[1],(t-l)*sizeof(longint));
move(tmpchain[1],chain[t-l+1],l*sizeof(longint));
inc(t);
chain[t]:=i;
used[i]:=true;
bo:=true;
break;
end;
if bo then
break;
end;
end;
print;
end.