Bellmanford算法

给你一张简单有向图,边权都为非负整数。以及一些询问,询问两个点之间的距离。

图用以下形式给出:

第一行输入三个整数 n,m,k,表示图的顶点数、边数和询问次数,顶点编号从 1 到 n。

接下来 m 行,每行三个整数 x,y,z,表示 x 到 y 有一条有向边,边权为 z。

接下来 k 行,每行两个整数 x,y,询问从 x 到 y 的最短路长度,如果无法到达,输出 −1。

输入格式
第一行三个整数 n,m,k,表示图的顶点数、边数和询问次数。

接下来 m 行,每行有三个整数,代表一条边。

接下来 k 行,每行有两个整数,代表一次询问。

输出格式
输出共 k 行,每行一个数表示一次询问的答案。
#include<bits/stdc++.h>
using namespace std;
int n,m,k,dist[20001],pre[20001];
struct
{
    int x,y,v;
} edge[10001];

inline void shortpath(int s,int t)
{
    memset(dist,127,sizeof(dist));
    memset(pre,0,sizeof(pre));
    dist[s]=0;
    while(1)
    {
        bool ok=0;
        for(int i=1;i<=m;i++)
        {
            int x=edge[i].x,y=edge[i].y,v=edge[i].v;
            if(dist[x]+v<dist[y])
            {
                dist[y]=dist[x]+v;
                pre[y]=x;
                ok=1;
            }
        }
        if(!ok)
            break;
    }
    if(dist[t]<(1<<30))
        cout<<dist[t]<<endl;   
    else cout<<-1<<endl;    
}
int main()
{
    cin>>n>>m>>k;
    for(int i=1;i<=m;i++)
    {
        cin>>edge[i].x>>edge[i].y>>edge[i].v;
    }
    for(int i=1;i<=k;i++)
    {
        int x,y;
        cin>>x>>y;
        shortpath(x,y);
    }
    return 0;
}

从start开始 一直到end 走无数次 直到每一次走后 没有发生变换 break出去
每一次变化是 每一次<之前的

posted @ 2022-12-28 23:02  Szang  阅读(21)  评论(0编辑  收藏  举报