1 条题解
-
0
Prim
#include <bits/stdc++.h> #define int long long using namespace std; const int MAXN = 100'000; const int MAXM = 1'000'000; const int INF = 1'000'000'000 + 1; int n, m; int h[MAXN + 5]; vector<pair<int, int>> e[MAXN + 5]; //<<点的高度,到树距离>,点的编号> priority_queue<pair<pair<int, int>, int>> q; int dis[MAXN + 5]; bool vis[MAXN + 5]; signed main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n >> m; for (int i = 1; i <= n; i++) cin >> h[i]; for (int i = 1; i <= m; i++) { int u, v, w; cin >> u >> v >> w; e[u].push_back({v, w}); e[v].push_back({u, w}); } for (int i = 1; i <= n; i++) { dis[i] = INF; vis[i] = false; } dis[1] = 0; q.push({{h[1], -dis[1]}, 1}); // 高度高优先、距离短优先 while (!q.empty()) { int u = q.top().second; q.pop(); if (vis[u]) continue; vis[u] = true; for (int i = 0; i < e[u].size(); i++) { int v = e[u][i].first; int w = e[u][i].second; if (vis[v] || h[v] > h[u]) continue; if (w < dis[v]) { dis[v] = w; q.push({{h[v], -dis[v]}, v}); } } } int ans = 0; int cnt = 0; for (int i = 1; i <= n; i++) if (dis[i] != INF) { cnt++; ans += dis[i]; } cout << cnt << " " << ans; return 0; }
信息
- ID
- 3389
- 时间
- 5000ms
- 内存
- 125MiB
- 难度
- 5
- 标签
- 递交数
- 36
- 已通过
- 12
- 上传者