关于贝尔曼福特算法,假设有n个顶点,我们只需要遍历n-1轮就可以了,因为在一个含n个顶点的图中,任意两点之间的最短路径最多含有n-1条边, 什么原理,我就不讲了,网上大牛博客很多,我在这里上一点干货:
1.最原始的贝尔曼福特算法,时间复杂度为O(NM):
再次学习
//板子
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
const int inf=0x3f3f3f3f;
const int N=5005;
int n,m;
struct node
{
int w;
int v;
int nex;
} e[N];
int firs[N],tot;
void edge(int u,int v,int w)
{
e[tot].w=w;
e[tot].v=v;
e[tot].nex=firs[u];
firs[u]=tot++;
}
int dis[N],vis[N];
void spfa(int u)
{
memset(dis,inf,sizeof(dis));
dis[u]=0;
memset(vis,0,sizeof(vis));
vis[u]=1;
queue<int>q;
q.push(u);
while(!q.empty())
{
int p=q.front();
q.pop();
vis[p]=0;
for(int i=firs[p]; i!=-1; i=e[i].nex)
{
if(dis[p]+e[i].w<dis[e[i].v])
{
dis[e[i].v]=dis[p]+e[i].w;
if(!vis[e[i].v])
{
q.push(e[i].v);
vis[e[i].v]=1;
}
}
}
}
}
int main()
{
while(~scanf(