3 7 6 7 4 7 3 6 2 1 3 5
2
//最短路,把每条公交线路上的站点两两联通并赋值为 1 就可以用dijkstra求解。1位源点,n为目标点。
#include<cstdio> #include<cstring> #define inf 0xfffffff #define N 505 int dis[N],map[N][N],vis[N],n,m,a[5005]; void dijkstra() { int m,k; for(int i=1;i<=n;i++) { m=inf; for(int j=1;j<=n;j++) { if(!vis[j]&&dis[j]<m) { m=dis[j]; k=j; } } if(m==inf) break; vis[k]=1; for(int j=1;j<=n;j++) { if(!vis[j]) { if(dis[j]>dis[k]+map[k][j]) dis[j]=dis[k]+map[k][j]; } } } } int main() { //freopen("a.txt","r",stdin); int s; char as; while(scanf("%d%d",&m,&n)!=EOF) { memset(vis,0,sizeof(vis)); memset(a,0,sizeof(a)); for(int i=1;i<=n;i++) { dis[i]=inf; for(int j=1;j<=n;j++) map[i][j]=inf; } for(int i=1;i<=m;i++) { s=0;as=1; while(as!=10) { s++; scanf("%d",&a[s]); as=getchar(); } //printf("%d\n",s); //for(int j=1;j<=s;j++) //printf("%d ",a[j]); // printf("\n"); for(int j=1;j<s;j++) for(int l=j+1;l<=s;l++) map[a[j]][a[l]]=1; } dis[1]=0; dijkstra(); if(dis[n]>=inf) printf("NO\n"); else printf("%d\n",dis[n]-1); } return 0; }
原文地址:http://blog.csdn.net/u012773338/article/details/38060803