1. 程式人生 > >wenbao與最短路(spfa)

wenbao與最短路(spfa)

不斷學習 pop 判斷 利用 ont iostream main pri max

spfa就是利用鄰接表和隊列進行優化的最短路!!!

牛!!!

利用spfa判斷圖中的負環:如果一個點入隊次數超過n則存在負環

 1 #include <iostream>
 2 #include <string.h>
 3 #include <queue>
 4 #include <vector>
 5 using namespace std;
 6 const int maxn =  1010;
 7 int n, m, s, t, from, to, val, T[maxn];
 8 bool mark[maxn];
9 vector<int> a[maxn]; 10 vector<int> b[maxn]; 11 void spfa(){ 12 memset(T, 0x3f, sizeof(T)); 13 T[s] = 0; 14 queue<int> q; 15 q.push(s); 16 while(!q.empty()){ 17 int k = q.front(); 18 q.pop(); 19 mark[k] = false; 20 for(int
i = 0; i < a[k].size(); i++)if(T[k] + b[k][i] < T[a[k][i]]) { 21 T[a[k][i]] = T[k] + b[k][i]; 22 if(!mark[a[k][i]]){ 23 q.push(a[k][i]); 24 mark[a[k][i]] = true; 25 } 26 } 27 } 28 } 29 int main(){ 30 scanf("
%d %d %d %d", &n, &m, &s, &t); 31 for(int i = 0; i < m; i++) { 32 scanf("%d %d %d", &from, &to, &val); 33 a[from].push_back(to); 34 b[from].push_back(val); 35 a[to].push_back(from); 36 b[to].push_back(val); 37 } 38 spfa(); 39 printf("%d\n", T[t]); 40 return 0; 41 }

只有不斷學習才能進步!

wenbao與最短路(spfa)