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);
    


}

  

posted @ 2021-12-03 21:01  大废物  阅读(99)  评论(0)    收藏  举报