pku 1847(最短路径,floyd)

 要注意的是对于每个十字路口它所指向的第一个路口是不需要转向的,此时应把路径设为0,否则设为1.

 最后的路径若值小于inf即为转向次数,否则不可通,输出 -1.

 

 #include <iostream> using namespace std; const int num=150; int n,a,b,tmp,t; int dis[num][num]; //保存最短路径的值 const int inf=99999999; void init() { for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) { dis[i][j] = inf; dis[j][i] = inf; if(i==j) { dis[i][j]=0; dis[j][i]=0; } } } void floyd() { for(int k=1;k<=n;++k) for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) { if( dis[i][k]+dis[k][j] < dis[i][j] ) dis[i][j] = dis[i][k]+dis[k][j]; } } int main() { cin>>n>>a>>b; init(); for(int i=1;i<=n;++i) { cin>>tmp; for(int j=0;j<tmp;++j) { cin>>t; if(j==0) dis[i][t] = 0; //指向的第一个路口无需转向 else dis[i][t]=1; } } floyd(); if(dis[a][b]<inf) cout<<dis[a][b]<<endl; else cout<<-1<<endl; return 0; }

你可能感兴趣的:(pku 1847(最短路径,floyd))