其實就是用隊列對Bellman-Ford進行優化:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
static const int maxn=1000;//點的數目
static const int INF=0x3f3f3f3f;
int n,m;//n爲點的個數,m爲邊的個數
int head[maxn];//head[u]保存節點u的第一條邊的編號
int u[maxn],v[maxn],w[maxn],next[maxn];//next[e]表示編號爲e的邊的下一條邊的編號
void read_graph()
{
scanf("%d%d",&n,&m);
memset(head,-1,sizeof(head));
for(int e=0;e<m;e++)
{
scanf("%d%d%d",&u[e],&v[e],&w[e]);
next[e]=head[u[e]];
head[u[e]]=e;
}
}
int dis[maxn];
bool spfa(int start,int n)
{
queue<int> q;
bool inq[maxn];//"在隊列中的標記"
int cnt[maxn];//在隊列中的次數
for(int i=0;i<n;i++) dis[i]=INF;
dis[start]=0;
memset(inq,0,sizeof(inq));
memset(cnt,0,sizeof(cnt));
cnt[start]=1;
q.push(start);
while(!q.empty())
{
int x=q.front();q.pop();
inq[x]=false;
for(int e=head[x];e!=-1;e=next[e])
if(dis[v[e]]>dis[x]+w[e])
{
dis[v[e]]=dis[x]+w[e];
if(!inq[v[e]])
{
inq[v[e]]=true;
q.push(v[e]);
if(++cnt[v[e]]>n) return false;//cnt[i] 爲入隊列次數,用來判定是否存在負環迴路
}
}
}
return true;
}
int main()
{
read_graph();
if(spfa(0,n))
for(int i=0;i<n;i++)
cout<<i<<" "<<dis[i]<<endl;
return 0;
}