如果发现广告等破坏行为,请尽量将条目恢复到较早的版本而不是把相应内容直接删除,谢谢合作。
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.

