Til the Cows Come Home(poj-2387)
兔子很热爱学习,为了多学习她希望可以找最快的路线去上学。她的城市里有N个(2 <= N <= 1000)个地铁站,编号分别为1..N。兔子家在1号地铁站旁边,学校是N号地铁站。地铁站之间共有M (1 <= M <= 2000)条双向路径。兔子现在在1号地铁站,她希望知道到学校最短需要多少时间。可以保证兔子能到达学校。忽略换乘地铁的等待时间
Input
第一行:m和n
接下来的m行:每一行有x,y,z三个整数。代表x站到y站或者y站到x站需要z分钟(1<=z<=100)
Output
兔子到学校最少需要多少时间。
Sample Input
5 5 1 2 20 2 3 30 3 4 20 4 5 20 1 5 100
Sample Output
90
/*
需要引进两个集合S和U。
S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),
而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离)。
*/
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; const int maxn = 1e3+10; const int inf = 0x3fffffff; int a[maxn][maxn]; int dis[maxn];//起点到每个点的最短距离
int vis[maxn];//若vis[i]=1,则该点已经求出最短距离,即该点属于集合S,否则该点属于集合U
int m,n;
void dejkstra(int n){
vis[0]=1;
for(int i=0;i<n-1 ;i++){
int min = inf;
int k=1;
for(int j=0;j<n;j++){
if(!vis[j]&&min>dis[j]){//找出U中到集合S中的最短顶点
min = dis[j];
k=j;
}
}
vis[k]=1;//将该点划入集合S
for(int j=0;j<n;j++){
if(!vis[j]&&dis[j]>dis[k]+a[k][j]){//通过k点更新集合U中顶点到集合S的最短路径
dis[j]=dis[k]+a[k][j];
}
}
}
cout<<dis[n-1]<<endl;
}
int main(){
for(int i=0;i<maxn;i++){
a[i][i]=0;
for(int j=0;j<i;j++){
a[i][j]=a[j][i]=inf;
}
}
memset(vis,0,sizeof(vis));
cin>>m>>n;
int x,y,cost;
for(int i=0;i<m;i++){
cin>>x>>y>>cost;
if(cost<a[x-1][y-1]) a[x-1][y-1]=a[y-1][x-1]=cost;
}
for(int i=0;i<n;i++){
dis[i]=a[0][i];
}
dejkstra(n);
}

浙公网安备 33010602011771号