spfa演算法鄰接表實現

2021-09-02 05:22:24 字數 1072 閱讀 7496

「東信杯」廣西大學第一屆程式設計競賽(同步賽)

• 題意:在有向圖選取一條路徑使得路徑中邊權乘積最短,其中邊

權必定為2的正整數次冪。

• 考慮最短路模型是邊權相加,那麼我們只需要將乘法轉化為加法

也就是將邊權對2取對數,再計算最短路得到最短長度ans,最後

我們的答案就是2^ans % (1e9+7),最後計算冪時會溢位,所以暴

力ans次乘以2,每次都對其取模即可

//題意:

//在有向圖選取一條路徑使得路徑中邊權乘積最短,其中邊權必定為2的正整數次冪。

// 考慮最短路模型是邊權相加,那麼我們只需要將乘法轉化為加法也就是將邊權對2取對數,再計算最短路得到最短長度ans,

//最後我們的答案就是2^ans % (1e9+7),最後計算冪時會溢位,所以暴力ans次乘以2,每次都對其取模

#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

const int maxn=5e6+7;

const int mod=1e9+7;

const int inf=0x3f3f3f3f;

int m,n,s,t,cnt;//cnt記錄結構陣列的位置1,2,3,4,5。。。。。

struct edgeedge[maxn];

int head[maxn],visit[maxn],dis[maxn];//head陣列記錄以u為起點的鄰接表表頭在結構陣列中的位置

//visit陣列記錄點是否在佇列中 ,dis陣列存入起點到各個點的最短距離

void add(int u,int v,int w)

queueq;//定義乙個佇列

void spfa()}}

} }int main()

spfa();

if(dis[t]!=inf)

printf("%d\n",ans);

} else

printf("-1\n");

}

最短路SPFA演算法 (通過鄰接表來實現)

適用範圍 給定的圖存在負權邊,這時類似dijkstra等演算法便沒有了用武之地,而bellman ford演算法的複雜度又過高,spfa演算法便派上用場了。我們約定有向加權圖g不存在負權迴路,即最短路徑一定存在。當然,我們可以在執行該演算法前做一次拓撲排序,以判斷是否存在負權迴路,但這不是我們討論的...

這是spfa 鄰接表實現的版本

鄰接表定義 typedef struct node edge edge map 150 void spfa int s d s 0 原點權值初始為0 此處n為乙個常量 int queue n n 佇列初始化 bool visit n visit陣列用於判斷點是否在佇列中 int front 0,re...

SPFA 靜態鄰接表 模板

spfa shotest path faster algorithm,是乙個效率很高的求最短路徑的演算法,也可以說是bellman ford演算法的優化版。具體做法是先把起點放入乙個佇列中。每次取出隊頂元素,並pop,看跟該點相鄰的其他點是否能夠鬆弛,如果可以鬆弛,改變量值,如果該點不在佇列中,則把...