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出去
每一次变化是 每一次<之前的