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 }
复制代码

 

 

 
posted @   Keyzee  阅读(47)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示