1. 程式人生 > 其它 >PTA-L2-001緊急救援(dfs + dijkstra)

PTA-L2-001緊急救援(dfs + dijkstra)

題目連結:https://pintia.cn/problem-sets/994805046380707840/problems/994805073643683840

思路:先求最短路,再用dfs搜點;

  1 #include<iostream>
  2 #include<algorithm>
  3 #include<cmath>
  4 #include<cstring>
  5 #include<string>
  6 #include<vector>
  7 #include<map>
  8 #include<queue>
  9
#define inf 0x3f3f3f3f 10 #define ll long long 11 using namespace std; 12 const int N = 500 + 10; 13 14 struct node { 15 int to, val; 16 }; 17 18 int sp; 19 int num[N], vis[N], maxn, minx = inf, ans, dis[N]; 20 vector<node>G[N]; 21 vector<int>vec, fi; 22 23 struct point {
24 int dis; 25 int pos; 26 bool operator <(const point& x)const 27 { 28 return x.dis < dis; 29 } 30 }; 31 32 int dijkstra(int t,int pfinal) { 33 memset(dis, 0x3f, sizeof(dis)); 34 memset(vis, 0, sizeof(vis)); 35 priority_queue<point>pq;
36 dis[t] = 0; 37 point h; 38 h.dis = 0, h.pos = t; 39 pq.push(h); 40 while (!pq.empty()) { 41 point tmp = pq.top(); 42 pq.pop(); 43 int p = tmp.pos, d = tmp.dis; 44 if (vis[p]) continue; 45 vis[p] = 1; 46 if (p == pfinal) return dis[p]; 47 for (int i = 0; i < G[p].size(); i++) { 48 int frt = G[p][i].to, dist = G[p][i].val; 49 if (!vis[frt] && dis[p] + dist < dis[frt]) { 50 dis[frt] = dis[p] + dist; 51 point hh; 52 hh.dis = dis[frt], hh.pos = frt; 53 pq.push(hh); 54 } 55 } 56 } 57 return 0; 58 } 59 60 void dfs(int pos, int f, int sum, int dep, int hp) { 61 62 //memset(vis, 0, sizeof(vis)); 63 //vis[pos] = 1; 64 //vec.push_back(pos); 65 //cout << sum << "hhh"; 66 if (sum > sp) return; 67 int len = G[pos].size(); 68 if (pos == f) { 69 //cout << sum << "hhh" << "\n"; 70 //if (sum < minx) { 71 // minx = sum; 72 // maxn = hp; 73 // ans = 1; 74 // fi = vec; 75 //} 76 //else if (sum == minx) { 77 // ans++; 78 // if (maxn < hp) { 79 // maxn = hp; 80 // //fi.clear(); 81 // /*cout << vec.size() << "fsdfsdf"; 82 // for (int i = vec.size() - 1; i >= 0; i--) { 83 // fi.push_back(vec[i]); 84 // }*/ 85 // fi = vec; 86 // } 87 //} 88 ans++; 89 if (maxn < hp) { 90 maxn = hp; 91 fi = vec; 92 } 93 return; 94 } 95 for (int i = 0; i < len; i++) { 96 int to_n = G[pos][i].to; 97 if (vis[to_n] != 1) { 98 vis[to_n] = 1; 99 vec.push_back(to_n); 100 dfs(to_n, f, sum + G[pos][i].val, dep + 1, num[to_n] + hp); 101 vis[to_n] = 0; 102 vector<int>::iterator it = vec.begin() + dep; 103 vec.erase(it); 104 } 105 } 106 107 return; 108 } 109 110 int main() { 111 112 int n, m, s, d; 113 cin >> n >> m >> s >> d; 114 for (int i = 0; i < n; i++) { 115 cin >> num[i]; 116 } 117 for (int i = 0; i < m; i++) { 118 int u, v, a; 119 cin >> u >> v >> a; 120 G[u].push_back({ v,a }); 121 G[v].push_back({ u,a }); 122 } 123 //vis[s] = 1; 124 vec.push_back(s); 125 sp = dijkstra(s, d); 126 //cout << dijkstra(0, 3) << "zdl" << "\n"; 127 memset(vis, 0, sizeof(vis)); 128 vis[s] = 1; 129 dfs(s, d, 0, 1, num[s]); 130 cout << ans << " " << maxn << "\n"; 131 for (int i = 0; i < fi.size(); i++) { 132 if (i == fi.size() - 1) { 133 cout << fi[i]; 134 } 135 else cout << fi[i] << " "; 136 } 137 138 return 0; 139 }