14分WA+RE求助,玄关

P4180 [BJWC2010] 严格次小生成树

首先问个问题,都已经 ```define int long long``` 了为什么还有个 ```long long cal```
by Frozen_Ladybug @ 2024-02-08 12:57:32


@[Frozen_Ladybug](/user/384719) 改成这样,70分了。 ```cpp #include <bits/stdc++.h> #define MAXN 100007 #define MAXM 300007 #define int long long using namespace std; struct edge { int nxt, to, val; } e[MAXN << 1]; int h[MAXN], cnt; void add(int u, int v, int w) { e[++cnt].nxt = h[u]; e[cnt].to = v; e[cnt].val = w; h[u] = cnt; } struct edge1 { int u, v, w; bool used; } e1[MAXN << 1]; int n, m, fa[MAXN], ans0; bool cmp(edge1 a, edge1 b) { return a.w < b.w; } int find(int x) { if(x != fa[x]) return fa[x] = find(fa[x]); else return x; } void kruskal() { sort(e1 + 1, e1 + m + 1, cmp); for(int i = 1; i <= m; i++) { int u = find(e1[i].u), v = find(e1[i].v); if(u == v) continue; ans0 += e1[i].w; add(e1[i].u, e1[i].v, e1[i].w); add(e1[i].v, e1[i].u, e1[i].w); e1[i].used = 1; fa[v] = u; } } int f[MAXN][20], mx[MAXN][20], mx2[MAXN][20], dep[MAXN]; void dfs(int u) { dep[u] = dep[f[u][0]] + 1; for(int i = 1; i <= 19; i++) { f[u][i] = f[f[u][i - 1]][i - 1]; if(mx[u][i - 1] == mx[f[u][i - 1]][i - 1]) { mx[u][i] = mx[u][i - 1]; mx2[u][i] = max(mx2[f[u][i - 1]][i - 1], mx2[u][i - 1]); } if(mx[u][i - 1] > mx[f[u][i - 1]][i - 1]) { mx[u][i] = mx[u][i - 1]; mx2[u][i] = max(mx[f[u][i - 1]][i - 1], mx2[u][i - 1]); } if(mx[f[u][i - 1]][i - 1] > mx[u][i - 1]) { mx[u][i] = mx[f[u][i - 1]][i - 1]; mx2[u][i] = max(mx[u][i - 1], mx2[f[u][i - 1]][i - 1]); } } for(int i = h[u]; i; i = e[i].nxt) { int v = e[i].to, w = e[i].val; if(v == f[u][0]) continue; f[v][0] = u; mx[v][0] = w; dfs(v); } } int lca(int u, int v) { if(dep[u] < dep[v]) swap(u, v); for(int i = 19; i >= 0; i--) if(dep[u] - dep[v] >= (1 << i)) u = f[u][i]; if(u == v) return u; for(int i = 19; i >= 0; i--) { if(f[u][i] != f[v][i]) { u = f[u][i]; v = f[v][i]; } } return f[u][0]; } int cal(int u, int v, int w) { int l = lca(u, v); int nmx = 0, nmx2 = 0; for(int i = 19; i >= 0; i--) { if(dep[f[u][i]] >= dep[l]) { if(nmx == mx[u][i]) nmx2 = max(mx2[u][i], nmx2); if(nmx > mx[u][i]) nmx2 = max(mx[u][i], nmx2); if(nmx < mx[u][i]) { nmx2 = max(mx2[u][i], nmx); nmx = mx[u][i]; } u = f[u][i]; } if(dep[f[v][i]] >= dep[l]) { if(nmx == mx[v][i]) nmx2 = max(mx2[v][i], nmx2); if(nmx > mx[v][i]) nmx2 = max(mx[v][i], nmx2); if(nmx < mx[v][i]) { nmx2 = max(mx2[v][i], nmx); nmx = mx[v][i]; } v = f[v][i]; } } if(w != nmx) return ans0 - nmx + w; if(nmx2) return ans0 - nmx2 + w; return LONG_LONG_MAX; } signed main() { cin >> n >> m; for(int i = 1; i <= m; i++) cin >> e1[i].u >> e1[i].v >> e1[i].w; for(int i = 1; i <= n; i++) fa[i] = i; kruskal(); dfs(1); int ans = LONG_LONG_MAX; for(int i = 1; i <= m; i++) if(!e1[i].used) ans = min(cal(e1[i].u, e1[i].v, e1[i].w), ans); cout << ans; return 0; } ```
by littlesnake @ 2024-02-08 13:03:55


@[Frozen_Ladybug](/user/384719) 又改成这样,93分了。 ```cpp #include <bits/stdc++.h> #define MAXN 100007 #define MAXM 300007 #define int long long using namespace std; struct edge { int nxt, to, val; } e[MAXM << 1]; int h[MAXN], cnt; void add(int u, int v, int w) { e[++cnt].nxt = h[u]; e[cnt].to = v; e[cnt].val = w; h[u] = cnt; } struct edge1 { int u, v, w; bool used; } e1[MAXM << 1]; int n, m, fa[MAXN], ans0; bool cmp(edge1 a, edge1 b) { return a.w < b.w; } int find(int x) { if(x != fa[x]) return fa[x] = find(fa[x]); else return x; } void kruskal() { sort(e1 + 1, e1 + m + 1, cmp); for(int i = 1; i <= m; i++) { int u = find(e1[i].u), v = find(e1[i].v); if(u == v) continue; ans0 += e1[i].w; add(e1[i].u, e1[i].v, e1[i].w); add(e1[i].v, e1[i].u, e1[i].w); e1[i].used = 1; fa[v] = u; } } int f[MAXN][20], mx[MAXN][20], mx2[MAXN][20], dep[MAXN]; void dfs(int u) { dep[u] = dep[f[u][0]] + 1; for(int i = 1; i <= 19; i++) { f[u][i] = f[f[u][i - 1]][i - 1]; if(mx[u][i - 1] == mx[f[u][i - 1]][i - 1]) { mx[u][i] = mx[u][i - 1]; mx2[u][i] = max(mx2[f[u][i - 1]][i - 1], mx2[u][i - 1]); } if(mx[u][i - 1] > mx[f[u][i - 1]][i - 1]) { mx[u][i] = mx[u][i - 1]; mx2[u][i] = max(mx[f[u][i - 1]][i - 1], mx2[u][i - 1]); } if(mx[f[u][i - 1]][i - 1] > mx[u][i - 1]) { mx[u][i] = mx[f[u][i - 1]][i - 1]; mx2[u][i] = max(mx[u][i - 1], mx2[f[u][i - 1]][i - 1]); } } for(int i = h[u]; i; i = e[i].nxt) { int v = e[i].to, w = e[i].val; if(v == f[u][0]) continue; f[v][0] = u; mx[v][0] = w; dfs(v); } } int lca(int u, int v) { if(dep[u] < dep[v]) swap(u, v); for(int i = 19; i >= 0; i--) if(dep[u] - dep[v] >= (1 << i)) u = f[u][i]; if(u == v) return u; for(int i = 19; i >= 0; i--) { if(f[u][i] != f[v][i]) { u = f[u][i]; v = f[v][i]; } } return f[u][0]; } int cal(int u, int v, int w) { int l = lca(u, v); int nmx = 0, nmx2 = 0; for(int i = 19; i >= 0; i--) { if(dep[f[u][i]] >= dep[l]) { if(nmx == mx[u][i]) nmx2 = max(mx2[u][i], nmx2); if(nmx > mx[u][i]) nmx2 = max(mx[u][i], nmx2); if(nmx < mx[u][i]) { nmx2 = max(mx2[u][i], nmx); nmx = mx[u][i]; } u = f[u][i]; } if(dep[f[v][i]] >= dep[l]) { if(nmx == mx[v][i]) nmx2 = max(mx2[v][i], nmx2); if(nmx > mx[v][i]) nmx2 = max(mx[v][i], nmx2); if(nmx < mx[v][i]) { nmx2 = max(mx2[v][i], nmx); nmx = mx[v][i]; } v = f[v][i]; } } if(w != nmx) return ans0 - nmx + w; if(nmx2) return ans0 - nmx2 + w; return LONG_LONG_MAX; } signed main() { cin >> n >> m; for(int i = 1; i <= m; i++) cin >> e1[i].u >> e1[i].v >> e1[i].w; for(int i = 1; i <= n; i++) fa[i] = i; kruskal(); dfs(1); int ans = LONG_LONG_MAX; for(int i = 1; i <= m; i++) if(!e1[i].used) ans = min(cal(e1[i].u, e1[i].v, e1[i].w), ans); cout << ans; return 0; } ```
by littlesnake @ 2024-02-08 13:05:37


|