1 solutions
-
0
C++ :
#include <cstdio> #include <algorithm> using namespace std; const int N = 1e5 + 5; const int M = 2e5 + 5; const long long oo = 1e18; int n, m; int u[M], v[M], w[M], p[M]; int h[N], id[M], nx[M], et; int f[N], mark[M]; long long s, ans[M]; int dep[N], pid[N]; bool cmp(int x, int y) { return w[x] < w[y]; } int getf(int u) { return f[u] ? f[u] = getf(f[u]) : u; } void link(int x, int p) { id[++et] = p; nx[et] = h[x]; h[x] = et; } void dfs(int x, int f = 0, int p = 0) { dep[x] = dep[f] + 1; pid[x] = p; for (int i = h[x]; i; i = nx[i]) { int to = u[id[i]] ^ v[id[i]] ^ x; if (to != f) dfs(to, x, id[i]); } } int main() { scanf("%d%d", &n, &m); for (int i = 1; i <= m; i++) { scanf("%d%d%d", &u[i], &v[i], &w[i]); p[i] = i; } sort(p + 1, p + m + 1, cmp); for (int i = 1; i <= m; i++) { int x = u[p[i]], y = v[p[i]]; if (getf(x) == getf(y)) continue; mark[p[i]] = 1; f[getf(x)] = getf(y); s += w[p[i]]; link(x, p[i]); link(y, p[i]); } for (int i = 1; i <= m; i++) ans[i] = mark[i] ? oo : s; dfs(1); for (int i = 1; i <= n; i++) f[i] = 0; for (int i = 1; i <= m; i++) { if (mark[p[i]]) continue; int x = getf(u[p[i]]), y = getf(v[p[i]]); while (x != y) { if (dep[x] < dep[y]) swap(x, y); int to = u[pid[x]] ^ v[pid[x]] ^ x; ans[pid[x]] = s - w[pid[x]] + w[p[i]]; f[x] = to; x = getf(x); } } for (int i = 1; i <= m; i++) printf("%lld\n", ans[i] < oo ? ans[i] : -1); return 0; }
Information
- ID
- 155
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- (None)
- Tags
- # Submissions
- 0
- Accepted
- 0
- Uploaded By