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 }
永远热爱,永远向着光。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?