C - C--最短パス(ベルマン単一始点最短経路)

説明

これは、n個の点、Mエッジを含む、加重無向グラフを与えます。Sの取得、eが最短です。最短の存在を確認してください。
入力

入力の複数のセット。

データの各セットのために。

入力N-、Mの最初の行(1 <= N-N - && <= 5。10 ^ 5,1 <&& M = M <= 3。 10 ^ 6)。
三つの整数の次のM線は、U、V、W、U、Vのエッジ間(> = 0 w)の重みwを発現しています。
最後に入力S、E。
出力

整数回答の出力を表すデータの各セットのために。
サンプル

入力

3 1
1 2 3
1 2
出力

3

ベルマン:動作の次のサイクルは、最大実行のn-1倍、nはトップポイントである:
すべてのエッジeの(U、V)、遠い場合は[U]は+ W(U 、V)<[V]遠い[他の遠いですV] =遠い[U] + W(U、V)。W(U、V)は、エッジの重みeの(U、V)の


#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#define MAX 0x3f3f3f3f
#define N 500010
int n,m,cnt;
int v[N];
struct node
{
    int u,v,w;
}q[5000010];
void add(int u,int v,int w)
{
    q[cnt].u=u;
    q[cnt].v=v;
    q[cnt].w=w;
    cnt++;
}
void Bellman(int s,int e)
{
    memset(v,MAX,sizeof(v));
    v[s]=0;//这里很重要
    for(int i=1;i<n;i++)
    {
        int flag=1;
        for(int j=0;j<cnt;j++)
        {
            if(v[q[j].v] > v[q[j].u] +q[j].w)
            {
                v[q[j].v] = v[q[j].u] +q[j].w;
                flag=0;
            }
        }
        if(flag)//一定要优化,不然会超时  若上述操作没有对Distant进行更新,说明最短路径已经查找完毕,或者部分点不可达,跳出循环
            break;
    }
    printf("%d\n",v[e]);
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        cnt=0;
        for(int i=0; i<m; i++)
        {
            int u,v,w;
            scanf("%d%d%d",&u,&v,&w);
            add(u,v,w);
            add(v,u,w);//因为是无向图
        }
        int s,e;
        scanf("%d%d",&s,&e);
        Bellman(s,e);
    }
    return 0;
}

公開された177元の記事 ウォン称賛7 ビュー30000 +

おすすめ

転載: blog.csdn.net/Fusheng_Yizhao/article/details/104901922
おすすめ