|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
传送门:https://pintia.cn/problem-sets/9 ... /994805379664297984
解:
迪杰斯特拉 + DFS(模板)
- #include <iostream>
- #include <climits>
- #include <cstring>
- #include <vector>
- #include <map>
- #include <algorithm>
- using namespace std;
- const int maxn = 210;
- int n, k;
- int d[maxn];
- int pw[maxn];
- bool vis[maxn];
- int G[maxn][maxn];
- vector<int> pre[maxn];
- map<string, int> s2n;
- map<int, string> n2s;
- void DJS(void)
- {
- fill(d, d + maxn, INT_MAX);
- memset(vis, false, sizeof(vis));
- d[0] = 0;
- for (int i = 0; i < n; i++)
- {
- int u = -1, min = INT_MAX;
- for (int j = 0; j <= n; j++)
- if (!vis[j] && d[j] < min) min = d[u = j];
- if (u == -1) return;
- vis[u] = true;
- for (int v = 0; v <= n; v++)
- {
- if (vis[v] || G[u][v] == INT_MAX) continue;
- if (G[u][v] + d[u] < d[v])
- {
- d[v] = G[u][v] + d[u];
- pre[v].clear();
- pre[v].push_back(u);
- }
- else if (G[u][v] + d[u] == d[v])
- pre[v].push_back(u);
- }
- }
- }
- vector<int> path, temp_path;
- int opt_w = -1;
- int routes = 0;
- void DFS(int id)
- {
- if (!id)
- {
- int happy = 0;
- routes++;
- for (int i = temp_path.size() - 1; i >= 0; i--)
- happy += pw[temp_path[i]];
- if (happy > opt_w)
- {
- path = temp_path;
- opt_w = happy;
- }
- }
- temp_path.push_back(id);
-
- for (int i = 0; i < pre[id].size(); i++)
- DFS(pre[id][i]);
- temp_path.pop_back();
- }
- int main(void)
- {
- // freopen("input.txt", "r", stdin);
- string s;
- cin >> n >> k >> s;
- n2s[0] = s;
- s2n[s] = 0;
-
- for (int i = 1; i < n; i++)
- {
- cin >> s >> pw[i];
- n2s[i] = s;
- s2n[s] = i;
- }
- fill(G[0], G[0] + maxn * maxn, INT_MAX);
-
- while (k--)
- {
- string s1, s2;
- int cost;
- cin >> s1 >> s2 >> cost;
- int a = s2n[s1], b = s2n[s2];
- G[a][b] = G[b][a] = cost;
- }
- DJS();
- DFS(s2n["ROM"]);
- cout << routes << " " << d[s2n["ROM"]] << " " << opt_w << " " << opt_w / path.size() << endl;
- cout << n2s[0];
- for (int i = path.size() - 1; i >= 0; i--)
- cout << "->" << n2s[path[i]];
-
- return 0;
- }
复制代码 |
|