「東信杯」廣西大學第一屆程式設計競賽(同步賽)
• 題意:在有向圖選取一條路徑使得路徑中邊權乘積最短,其中邊
權必定為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,看跟該點相鄰的其他點是否能夠鬆弛,如果可以鬆弛,改變量值,如果該點不在佇列中,則把...