/*
题意:输入 N,A,B表示 有N个交叉口,起点为A终点为B
输入K表示该交叉口可以去k处 且第一个是默认方向其他方向需要转变方向
题目链接:
http://poj.org/problem?id=1847
思路:
对于默认方向 权值为0,其他方向权值为1 不能到达为INF
*/
#include<cstdio>
#define INF 1000000000
const int MAXN=112;
int G[MAXN][MAXN],dis[MAXN];
int level[MAXN];
void dijkstra(int s,int n)
{
int i,pos=s,j,min;
bool vis[MAXN]={0};
for(int i=0;i<=n;++i) dis[i]=INF;
for(int i=1;i<=n;++i)
dis[i]=G[pos][i];
vis[pos]=true;
for(i=1;i<n;++i)
{
for(j=1,min=INF;j<=n;++j)
{
if(!vis[j]&&dis[j]<min)
{
min=dis[j];
pos=j;
}
}
vis[pos]=true;
for(j=1;j<=n;++j)if(!vis[j]){
if(dis[j]>G[pos][j]+dis[pos]){
dis[j]=G[pos][j]+dis[pos];
}
}
}
}
int main()
{
int N,A,B;
int n,out;
while(~scanf("%d %d %d",&N,&A,&B)){
for(int i=0;i<=N;++i)
for(int j=0;j<=N;++j)
G[i][j]=INF;
for(int i=1;i<=N;++i)
{
scanf("%d",&n);
for(int j=0;j<n;++j){
scanf("%d",&out);
if(j==0)
G[i][out]=0;
else if(G[i][out]!=0)
G[i][out]=1;
}
}
dijkstra(A,N);
if(dis[B]>=INF)
puts("-1");
else
printf("%d\n",dis[B]);
}
}
POJ 1847 Tram
最新推荐文章于 2021-02-26 09:53:48 发布