算法提高课-图论-单源最短路的综合应用-AcWing 1135. 新年好:dijkstra和dfs暴搜结合
生活随笔
收集整理的這篇文章主要介紹了
算法提高课-图论-单源最短路的综合应用-AcWing 1135. 新年好:dijkstra和dfs暴搜结合
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目分析
來源:acwing
分析:
ac代碼
#include<bits/stdc++.h> #define x first #define y second using namespace std; const int N = 50010, M = 2e5 +10; const int INF = 0x3f3f3f3f; typedef pair<int ,int > PII;int n, m; int source[6]; bool st[N];int dist[6][N]; int h[N],e[M],ne[M],w[M],idx;void add(int a, int b, int c){e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++; }void dijkstra(int start, int dist[]){memset(dist, 0x3f, 4*N); // int 4個字節,所以大小是4*Nmemset(st,0, sizeof st);dist[start] = 0;priority_queue<PII,vector<PII>, greater<PII>> heap;heap.push({0,start}); // 距離,點while(heap.size()){auto t = heap.top();heap.pop();int ver = t.y, distance = t.x;if(st[ver]) continue;st[ver] = true;for(int i = h[ver]; ~i; i = ne[i]){int j = e[i];if(dist[j] > distance + w[i]){dist[j] = distance + w[i];heap.push({dist[j], j});}}} }// 枚舉每種拜訪次序,求出最小距離 // 拜訪了u個人,自己是第1個人;當前起點是source[start],當前走過的距離是distance int dfs(int u, int start, int distance){// u== 6表示:拜訪完5個親戚,此時返回最短路if( u == 6) return distance;// res存距離最短的分支int res = INF;for(int i = 1; i<=5; i ++)if(!st[i]){int next = source[i]; // 走親戚ist[i] = true;res = min(res, dfs(u +1, i, dist[start][next] + distance));st[i] = false;}return res; }int main(){cin >> n >> m;memset(h, -1, sizeof h);source[0] = 1; for(int i = 1; i <= 5; i ++) cin >> source[i]; while(m --){int x, y, t;cin >> x >> y >> t;add(x, y, t), add(y, x, t);}// 6 個點,分別求最短路for(int i =0; i < 6; i ++) dijkstra(source[i],dist[i]);/*1. 共有6個人,起點是自己:第1個人2. 當前是source[0]:佳佳3. 當前走過的距離是0*/memset(st,0, sizeof st);printf("%d\n", dfs(1, 0, 0));}題目來源
https://www.acwing.com/problem/content/1137/
總結
以上是生活随笔為你收集整理的算法提高课-图论-单源最短路的综合应用-AcWing 1135. 新年好:dijkstra和dfs暴搜结合的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 算法提高课-图论-单源最短路的建图方式-
- 下一篇: 算法提高课-图论-单源最短路的综合应用-