最短経路|ダイクストラ

最短経路


hdu2544から
制限時間:1秒
メモリ制限:32MB

問題の説明

毎年恒例の学校大会では、決勝に出場するすべての生徒にとても美しいTシャツが贈られます。しかし、スタッフが何百もの服を店からスタジアムに戻すたびに、彼らはとても疲れていました!だから今、彼らは店からスタジアムまでの最短ルートを見つけたいと思っています、あなたは彼らを助けることができますか?

入力

入力には複数のデータセットが含まれます。データの各グループの最初の行は、2つの整数NとM(N <= 100、M <= 10000)です。Nは成都の通りの交差点の数を示し、1というラベルの付いた交差点は店舗の場所です。 Nとラベル付けされた交差点それはスタジアムの場所です、Mは成都にいくつかの道路があると言いました。N = M = 0は、入力の終了を意味します。次のM行、各行には3つの整数A、B、C(1 <= A、B <= N、1 <= C <= 1000)が含まれており、交差点Aと交差点Bの間に道路があることを示しています。スタッフがこのように歩くにはC分かかります。
店舗からスタジアムまでのルートが少なくとも1つあることを確認するために入力します。

出力

入力のグループごとに、1行を出力します。これは、スタッフが店舗からスタジアムまで歩くのに最短の時間を意味します。

サンプル入力

2 1
1 2 3
3 3
1 2 5
2 3 5
3 1 2
0 0

サンプル出力

3
2

最短経路問題、負の側面がない場合、ダイクストラはACを落とす可能性があります。

#include<cstdio>
#include<cstring>
using namespace std;
int mp[105][105],dis[105];               //mp存储地图,dis是距离状态
bool note[105];                          //后续dij算法查看某个点是否已经被选取过
int n,m;                                 //点、边
void init(){
    
                                 //初始化
    memset(mp,0x3f,sizeof(mp)),memset(note,false,sizeof(note));
    int f,t,w;
    for(int i = 1;i <= m;++i)
        scanf("%d %d %d",&f,&t,&w),mp[f][t] = mp[t][f] = w;
    for(int i = 2;i <= n;++i)
        dis[i] = mp[1][i];
    dis[1] = 0;note[1] = true;
} 
void solve(){
    
    
    for(int i = 2;i <= n;++i){
    
          //dijkstra
        int mi = 0x3f3f3f3f,k = -1;
        for(int j = 2;j <= n;++j)
            if(!note[j] && mi > dis[j])
                mi = dis[j],k = j;
        note[k] = true;
        for(int j = 2;j <= n;++j)
            if(dis[j] > dis[k] + mp[k][j])
                dis[j] = dis[k] + mp[k][j];
    }
    printf("%d\n",dis[n]);
}
int main(){
    
    
    while(scanf("%d %d",&n,&m) && (n || m)){
    
    
        init();
        solve();
    }
    return 0;
}

おすすめ

転載: blog.csdn.net/qq_45985728/article/details/113702520
おすすめ