算法提高课-图论-单源最短路的建图方式-AcWing 1127. 香甜的黄油:spfa最短路
題目分析
來(lái)源:acwing
分析:
多源匯最短路。所以我們首先想到的是floyd算法, 可是它的復(fù)雜度是O(n3)O(n^3)O(n3),會(huì)超時(shí)。所以我們需要另外考慮。
任意一個(gè)點(diǎn)作為起點(diǎn)求出到所有點(diǎn)的最短距離,之后求和。 這個(gè)過程要對(duì)每個(gè)點(diǎn)做一遍。
樸素版dijkstra,做一遍是O(n2)O(n^2)O(n2) ,然后對(duì)n個(gè)點(diǎn)做,復(fù)雜度是O(n3)O(n^3)O(n3),太慢,不能用。
堆優(yōu)化版的dijkstra,做一遍時(shí)間復(fù)雜度O(mlogn)O(mlogn)O(mlogn),然后對(duì)n個(gè)點(diǎn)做,復(fù)雜度是O(mnlogn)O(mnlogn)O(mnlogn),可以過!
spfa,做一遍時(shí)間復(fù)雜度O(m)O(m)O(m),做一遍最壞是O(mn)O(mn)O(mn)這里沒卡 .然后對(duì)n個(gè)點(diǎn)做,復(fù)雜度是O(nm)O(nm)O(nm),可以做。
具體寫法:
這里用spfa來(lái)求每個(gè)點(diǎn)作為起點(diǎn)的最短路,然后求和。
spfa需要用到queue,queue取隊(duì)頭的操作是front()
當(dāng)然也可以用堆優(yōu)化的dijkstra來(lái)做,有時(shí)間再寫吧。這里是復(fù)習(xí)一下spfa。
關(guān)于spfa的模板題:
最短路[Dijkstra和堆優(yōu)化的Dijkstra][Bellman-Ford和SPFA][Floyd最短路](更新中)
ac代碼
#include<bits/stdc++.h> #define x first #define y second using namespace std; typedef pair<int,int> PII; const int N = 810, M = 3000;//無(wú)向邊 const int INF = 0x3f3f3f3f; int n, p, m; int id[N]; // 每個(gè)奶牛的牧場(chǎng)編號(hào) int h[N],e[M],ne[M],w[M],idx; int dist[N],q[N]; bool st[N]; // spfa中的判重?cái)?shù)組void add(int a, int b, int c){e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++; }int spfa(int start){memset(dist, 0x3f, sizeof dist);dist[start] = 0;queue<int> q;q.push(start);st[start] = true;while(q.size()){int t = q.front();q.pop();st[t] = false;for(int i = h[t]; ~i; i = ne[i]){int j = e[i];if(dist[j] > dist[t] + w[i]){dist[j] = dist[t] + w[i];if(!st[j]){q.push(j);st[j] = true;}}}}int res = 0;// 遍歷每頭牛在哪兒,然后路徑求和for(int i = 0; i < n; i ++){int j = id[i]; // if(dist[j] == INF) return INF;res += dist[j];}return res; }int main(){cin >> n >> p >> m; // 牛的個(gè)數(shù),點(diǎn)數(shù),邊數(shù)for(int i = 0; i < n ; i++) cin >> id[i]; // 讀入每頭牛在哪個(gè)點(diǎn)memset(h, -1, sizeof h);for(int i = 0; i < m; i ++){int a, b, c;cin >> a >> b >> c;add(a, b, c), add(b,a,c);}int res = INF;for(int i = 1; i <= p; i ++) res = min(res, spfa(i));//傳入起點(diǎn)cout << res << endl; }題目來(lái)源
https://www.acwing.com/problem/content/1129/
總結(jié)
以上是生活随笔為你收集整理的算法提高课-图论-单源最短路的建图方式-AcWing 1127. 香甜的黄油:spfa最短路的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 算法提高课-图论-单源最短路的建图方式-
- 下一篇: 算法提高课-图论-单源最短路的建图方式-