跑步( Running . pas / c / C pp )

 跑步( 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. 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值