跑步( Running . pas / c / C pp )
【题目描述】
新牛到部队, CG 要求它们每天早上搞晨跑,从A农场跑到B农场。从A农场到B农场中有n-2个路口,分别标上号,A农场为1号, B农场为n号,路口分别为 2 ..n -1 号,从A农场到B农场有很多条路径可以到达,而CG发现有的路口是必须经过的,即每条路径都经过的路口,CG要把它们记录下来,这样CG就可以先到那个路口,观察新牛们有没有偷懒,而你的任务就是找出所有必经路口。
【输入数据】
第一行两个用空格隔开的整数 n ( 3<=n<=2000 )和e ( 1<=e<= 8000 )。
接下来从第2到第e + 1行,每行两个用空格隔开的整数p和q,表示路口p和q之间有路径直达。
输入数据保证必经路口一定存在,并且每个路口都和A农场、B农场相连通。
【输出数据】
第一行一个整数m,表示必经路口的数目。
第二行按从小到大的顺序依次输出每个必经路口的编号,每两个数之间用一个空格隔开。
注意:不包括起点和终点。
【样例输入】
6 6
1 2
2 4
2 3
3 5
4 5
5 6
【样例输出】
2
2 5
============================
天...自己着么可以那么天真...
天真的认为必须按1.2.3....n,这种递增顺序跑...
其实就是染色...
=====================================
type
node=^re;
re=record
x:longint;
next:node;
end;
var
n,e:longint;
map:array[1..2000]of node;
bool:array[1..2000]of boolean;
ans:array[1..2000]of longint;
ans_t:longint;
color:array[1..2000]of boolean;
duili:array[1..8000]of longint;
procedure init;
begin
assign(input,'running.in');
assign(output,'running.out');
reset(input); rewrite(output);
end;
procedure terminate;
begin
close(input); close(output);
halt;
end;
procedure insert(x,y:longint);
var
p:node;
begin
new(p);
p^.x:=y;
p^.next:=map[x];
map[x]:=p;
end;
function bfs:boolean;
var
p:node;
l,r:longint;
begin
l:=0; r:=1;
duili[1]:=1;
color[1]:=false;
while l<r do
begin
inc(l);
p:=map[duili[l]];
while p<>nil do
begin
if (color[p^.x]) and (bool[p^.x]) then
begin
color[p^.x]:=false;
inc(r);
duili[r]:=p^.x;
end;
p:=p^.next;
end;
end;
if color[n] then exit(false);
exit(true);
end;
procedure main;
var
i:longint;
x,y:longint;
begin
readln(n,e);
fillchar(bool,sizeof(bool),true);
for i:=1 to n do map[i]:=nil;
for i:=1 to e do
begin
readln(x,y);
// if x=y then continue;
//if x>y then
insert(y,x);
// else
insert(x,y);
end;
ans_t:=0;
for i:=2 to n-1 do
begin
fillchar(color,sizeof(color),true);
bool[i]:=false;
if not bfs then
begin
inc(ans_t);
ans[ans_t]:=i;
end;
bool[i]:=true;
end;
writeln(ans_t);
for i:=1 to ans_t-1 do
write(ans[i],' ');
writeln(ans[ans_t]);
end;
begin
init;
main;
terminate;
end.