标签:
Tram
Time Limit: 1000MS | Memory Limit: 30000K |
Description
Input
Output
Sample Input
3 2 1 2 2 3 2 3 1 2 1 2
Sample Output
0
题解
很简单的最短路问题,套版就行,建好图就行了,这里用未优化的Dijkstra就行了
代码
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int maxn = 100+7; const int inf=0x3f3f3f3f; //***************************************** //Dijkstra-数组实现O(n^2) //单源最短路 //lowcost[]-----从点beg到其他点的距离 //***************************************** bool vis[maxn]; void Dijkstra(int cost[][maxn],int lowcost[maxn],int n,int beg) { int minc; int i,j,w; memset(vis,false,sizeof(vis)); vis[beg]=true; for(i=1;i<=n;i++) lowcost[i]=cost[beg][i]; lowcost[beg]=0; for(i=1;i<=n;i++){ minc=inf; for(j=1;j<=n;j++){ if(!vis[j]&&lowcost[j]<minc){ minc=lowcost[j]; w=j; } } if(minc>=inf) break; vis[w]=true; for(j=1;j<=n;j++) if(!vis[j]&&lowcost[w]+cost[w][j]<lowcost[j]) lowcost[j]=lowcost[w]+cost[w][j]; } } int cost[maxn][maxn]; int dist[maxn]; int main() { int n,A,B; int k,t; while(scanf("%d%d%d",&n,&A,&B)!=EOF){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(i==j) cost[i][j]=0; else cost[i][j]=inf; } } for(int i=1;i<=n;i++){ scanf("%d",&k); for(int j=0;j<k;j++){ scanf("%d",&t); if(j==0) cost[i][t]=0; else cost[i][t]=1; } } Dijkstra(cost,dist,n,A); if(dist[B]>=inf) printf("-1\n"); else printf("%d\n",dist[B]); } return 0; }
标签:
原文地址:http://www.cnblogs.com/wangdongkai/p/5579237.html