如果发现广告等破坏行为,请尽量将条目恢复到较早的版本而不是把相应内容直接删除,谢谢合作。
URAL/1096
来自"NOCOW"
< URAL
//program cao 纪念我们伟大的曹师傅
#include <stdio.h> long k,r,a,b; long edge[1010][2]; long path[1010]; long dis[1010]; void Init() { long i,x,y; scanf("%ld",&k); for(i=1;i<=k;i++) { scanf("%ld%ld",&x,&y); edge[i][0]=x; edge[i][1]=y; } scanf("%ld%ld%ld",&r,&a,&b); } void PrintCan(long x) { long y; y=edge[x][0]; printf("%ld\n",dis[y]); do { printf("%ld\n",path[y]); y=edge[path[y]][1]; }while(y!=r); exit(0); } void PrintImp() { printf("IMPOSSIBLE\n"); } void BFS() { long i,x,y; short flag; for(i=1;i<=1000;i++) dis[i]=20000000; dis[r]=0; do { flag=0; for(i=1;i<=k;i++) { x=edge[i][0]; y=edge[i][1]; if((dis[y]<20000000)&&(dis[x]==20000000)) { dis[x]=dis[y]+1; path[x]=i; if((x==a)||(x==b)) PrintCan(i); flag=1; } } }while(flag); PrintImp(); } int main() { Init(); BFS(); return 0; }
const maxk=1000+5; var k,i,j,goal,head,tail,now,last:longint; a,b:array[1..maxk] of longint; go:array[1..maxk,0..maxk] of longint; f,path:array[1..maxk] of longint; d:array[1..maxk shl 1] of longint; v:array[1..maxk] of boolean; begin readln(k); for i:=1 to k do readln(a[i],b[i]); readln(goal,a[i+1],b[i+1]); inc(k); fillchar(go,sizeof(go),0); for i:=1 to k do begin for j:=1 to i-1 do if (a[i]=a[j]) or (b[i]=a[j]) then begin inc(go[i,0]); go[i,go[i,0]]:=j; end; for j:=i+1 to k do if (a[i]=a[j]) or (b[i]=a[j]) then begin inc(go[i,0]); go[i,go[i,0]]:=j; end; end; filldword(f,sizeof(f) div 4,maxlongint); filldword(path,sizeof(path) div 4,maxlongint); f[k]:=0; fillchar(v,sizeof(v),false);v[k]:=true; d[1]:=k; head:=1;tail:=1; while head<=tail do begin now:=d[head]; for i:=1 to go[now,0] do if f[go[now,i]]>f[now]+1 then begin f[go[now,i]]:=f[now]+1;path[go[now,i]]:=now; if not(v[go[now,i]]) then begin inc(tail); d[tail]:=go[now,i]; v[go[now,i]]:=true; end; end; v[now]:=false; inc(head); end; j:=maxlongint;last:=0; for i:=1 to k do if (a[i]=goal) or (b[i]=goal) then if f[i]<j then begin j:=f[i]; last:=i; end; if last=0 then begin writeln('IMPOSSIBLE'); halt; end; i:=1;j:=last; d[1]:=last; while path[j]<>k do begin inc(i); d[i]:=path[j]; j:=path[j]; end; writeln(i); for j:=i downto 1 do writeln(d[j]); end.