1 条题解
-
0
因为这题的特殊性质,用spfa跑多源最短路就最合适了。
#include <bits/stdc++.h> using namespace std; const int MAXN = 800; const int MAXM = 1450; int cnt, pos[505]; // 奶牛数,奶牛位置 int n, m, s; struct Edge { int v, w; }; vector<Edge> e[MAXN + 5]; int dis[MAXN + 5]; // dis[i]: s->i 的最短路 bool vis[MAXN + 5]; // vis[i]: i号点在不在队列里 queue<int> q; // 存储被优化过的点(尝试用它们作为起点的边优化边的终点) int main() { ios::sync_with_stdio(false); cin.tie(0); // 输入 cin >> cnt >> n >> m; for (int i = 1; i <= cnt; i++) cin >> pos[i]; for (int i = 1; i <= m; i++) { int u, v, w; cin >> u >> v >> w; e[u].push_back((Edge){v, w}); e[v].push_back((Edge){u, w}); } // SPFA int ans = 0x3f3f3f3f; for (int s = 1; s <= n; s++) { memset(dis, 0x3f, sizeof(dis)); memset(vis, false, sizeof(vis)); dis[s] = 0; q.push(s); vis[s] = true; while (!q.empty()) { int u = q.front(); q.pop(); vis[u] = false; // u点现在不在队列里了 for (int i = 0; i < e[u].size(); i++) { int v = e[u][i].v; int w = e[u][i].w; if (dis[u] + w < dis[v]) { dis[v] = dis[u] + w; if (vis[v] == false) { q.push(v); vis[v] = true; } } } } int now = 0; bool flag = true; for (int i = 1; i <= cnt; i++) { if (dis[pos[i]] == 0x3f3f3f3f) { flag = false; break; } now += dis[pos[i]]; } if (flag) ans = min(ans, now); } // 输出 cout << ans << "\n"; return 0; }
- 1
信息
- ID
- 564
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 5
- 标签
- (无)
- 递交数
- 33
- 已通过
- 15
- 上传者