單源最短路問題

我是力量的化身發表於2020-10-22

Bellman-ford演算法

用edge儲存每條路徑,d【N】陣列表示到源點的最短路長度,將源點的d設定為0,其他的d都設為inf,這樣n次操作中每次就只有和源點有關係的d會更新,值得一提的是,這個演算法很容易記錄路徑

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int n,m;
int cnt;
int pre[10005],d[10005];
struct edge{
	int u,v,c;
}e[10005];

void bell(){
    for(int k=1; k<=n; ++k)
    for(int i=0; i<cnt; ++i)
	{
       int x=e[i].u,y=e[i].v;
	   if(d[x]>d[y]+e[i].c)
	   {
		  d[x]=d[y]+e[i].c;
		  pre[x]=y;//記錄路徑
	   }
    }
}   
 
int main()
{
	cnt=0;
    cin>>n>>m;
	while(m--){
		int a,b,cost;
		cin>>a>>b>>cost;
        e[cnt].u=a;
		e[cnt].v=b;
		e[cnt++].c=cost;
		e[cnt].u=b;
		e[cnt].v=a;
		e[cnt++].c=cost;
	}
    bell();
   
    return 0;
}

 

相關文章