constint N = 1e5 + 5; int tot = 0, head[N]; structEdge { int next, to; } edge[N << 1]; inlinevoidadd_edge(int u, int v){ edge[++tot].next = head[u], edge[tot].to = v, head[u] = tot; } int n, u, v, deg[N], tag[N]; queue<int> q; voidbfs(){ for (int i = 1; i <= n; i++) { if (deg[i] == 1) q.emplace(i), tag[i] = true; } while (!q.empty()) { int u = q.front(); q.pop(); for (int j = head[u]; j != 0; j = edge[j].next) { int v = edge[j].to; if (--deg[v] == 1) q.emplace(v), tag[v] = true; } } }
void _main() { cin >> n; for (int i = 1; i <= n; i++) { cin >> u >> v; add_edge(u, v), add_edge(v, u); deg[u]++, deg[v]++; } bfs(); for (int i = 1; i <= n; i++) if (!tag[i]) cout << i << ' '; }
constint N = 5005; int tot = 1, head[N]; // 这里tot=1,则j和j^1互为反边 structEdge { int next, to; } edge[N << 1]; inlinevoidadd_edge(int u, int v){ edge[++tot].next = head[u], edge[tot].to = v, head[u] = tot; } int n, m, u, v, deg[N], tag[N]; queue<int> q; voidbfs(){ for (int i = 1; i <= n; i++) { if (deg[i] == 1) q.emplace(i), tag[i] = true; } while (!q.empty()) { int u = q.front(); q.pop(); for (int j = head[u]; j != 0; j = edge[j].next) { int v = edge[j].to; if (--deg[v] == 1) q.emplace(v), tag[v] = true; } } }
voiddfs(int u, int fa){ cout << u << ' '; vector<int> son; for (int j = head[u]; j != 0; j = edge[j].next) { int v = edge[j].to; if (v == fa) continue; son.emplace_back(v); } sort(son.begin(), son.end()); for (int v : son) dfs(v, u); }
int e; // 删掉的边 int cnt, cur[N], ans[N]; voiddfs2(int u, int fa){ cur[++cnt] = u; vector<int> son; for (int j = head[u]; j != 0; j = edge[j].next) { int v = edge[j].to; if (v == fa || j == e || j == (e ^ 1)) continue; son.emplace_back(v); } sort(son.begin(), son.end()); for (int v : son) dfs2(v, u); } voidupdate(){ for (int i = 1; i <= n; i++) { if (cur[i] > ans[i]) return; if (cur[i] < ans[i]) break; } memcpy(ans, cur, sizeof(cur)); }
void _main() { cin >> n >> m; for (int i = 1; i <= m; i++) { cin >> u >> v; add_edge(u, v), add_edge(v, u); deg[u]++, deg[v]++; } if (m == n - 1) returndfs(1, -1), void(); bfs(); unordered_set<int> ring; // 存环上的点 for (int i = 1; i <= n; i++) { if (!tag[i]) ring.emplace(i); } fill(ans + 1, ans + n + 1, 0x3f3f3f3f); unordered_set<longlong> vis; // 防止重复删边 for (int u : ring) { for (int j = head[u]; j != 0; j = edge[j].next) { int v = edge[j].to; if (vis.count(1LL * u * INT_MAX + v) || vis.count(1LL * v * INT_MAX + u)) continue; vis.emplace(1LL * u * INT_MAX + v); if (!ring.count(v)) continue; cnt = 0, e = j, fill(cur + 1, cur + n + 1, 0x3f3f3f3f); dfs2(1, -1), update(); } } for (int i = 1; i <= n; i++) cout << ans[i] << ' '; }
constint N = 1e5 + 5; int tot = 0, head[N]; structEdge { int next, to; } edge[N << 1]; inlinevoidadd_edge(int u, int v){ edge[++tot].next = head[u], edge[tot].to = v, head[u] = tot; } int n, u, v, p[N]; double k;
int fa[N]; intfind(int x){return x == fa[x] ? x : fa[x] = find(fa[x]);}
int dp[2][N]; voiddfs(int u, int fa){ dp[1][u] = p[u]; for (int j = head[u]; j != 0; j = edge[j].next) { int v = edge[j].to; if (v == fa) continue; dfs(v, u); dp[0][u] += max(dp[0][v], dp[1][v]), dp[1][u] += dp[0][v]; } }
void _main() { cin >> n; iota(fa, fa + n + 1, 0); for (int i = 1; i <= n; i++) cin >> p[i]; int x = -1, y = -1; for (int i = 1; i <= n; i++) { cin >> u >> v; u++, v++; int fu = find(u), fv = find(v); if (fu == fv) x = u, y = v; // 删去这条边 else fa[fu] = fv, add_edge(u, v), add_edge(v, u); } cin >> k; dfs(x, -1); int res = dp[0][x]; memset(dp, 0, sizeof(dp)), dfs(y, -1); cout << fixed << setprecision(1) << k * max(res, dp[0][y]); }