马蜂良好求调

P3275 [SCOI2011] 糖果

```cpp #include <bits/stdc++.h> #define memset0(a) memset(a, 0, sizeof a) using namespace std; typedef long long ll; typedef unsigned long long ull; const int MAXN = 1e5 + 5; const int MAXM = 1e5 + 5; int n, m; vector<int> G[MAXN]; struct Edge { int x, u, v; } e[MAXM]; int dfn[MAXN], low[MAXN], bel[MAXN], siz[MAXN], dfn_cnt, scc_cnt; stack<int> st; bool ins[MAXN]; void Tarjan(int u) { dfn[u] = low[u] = ++dfn_cnt; st.push(u); ins[u] = true; for (auto v : G[u]) { if (!dfn[v]) { Tarjan(v); low[u] = min(low[u], low[v]); } else if (ins[v]) low[u] = min(low[u], dfn[v]); } if (dfn[u] == low[u]) { scc_cnt++; int v; do { v = st.top(); st.pop(); ins[v] = false; bel[v] = scc_cnt; siz[scc_cnt]++; } while (v != u); } } int deg[MAXN]; // 入度 int f[MAXN]; // 每个缩点后的节点的最少分到的糖数量 int main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n >> m; for (int i = 1; i <= m; i++) cin >> e[i].x >> e[i].u >> e[i].v; // 加 0 边 for (int i = 1; i <= m; i++) { int x = e[i].x, u = e[i].u, v = e[i].v; if (x == 1) { G[u].push_back(v); G[v].push_back(u); } else if (x == 3) { G[v].push_back(u); } else if (x == 5) { G[u].push_back(v); } } // Tarjan for (int u = 1; u <= n; u++) if (!dfn[u]) Tarjan(u); // 缩点 memset0(G); n = scc_cnt; for (int i = 1; i <= m; i++) { int x = e[i].x, u = e[i].u, v = e[i].v; u = bel[u], v = bel[v]; if (x == 2 || x == 4) { if (u == v) { cout << -1 << '\n'; exit(0); } if (x == 2) { G[u].push_back(v); deg[v]++; } else if (x == 4) { G[v].push_back(u); deg[u]++; } } } // 拓扑排序 for (int u = 1; u <= n; u++) f[u] = 1; int tot = 0; queue<int> q; for (int u = 1; u <= n; u++) if (deg[u] == 0) q.push(u); while (!q.empty()) { int u = q.front(); q.pop(); tot++; for (auto v : G[u]) { f[v] = max(f[v], f[u]+1); deg[v]--; if (deg[v] == 0) q.push(v); } } if (tot < n) { cout << -1 << '\n'; exit(0); } ll ans = 0; for (int u = 1; u <= n; u++) ans += (ll)siz[u] * f[u]; cout << ans << '\n'; return 0; } ```
by August_Light @ 2023-11-04 17:21:40


@[August_Light](/user/589916) 看了一下 我猜是这样的 这组样例 ``` 3 2 3 1 2 4 2 3 ``` a[1]>=a[2] a[2]>a[3] 应当输出5 但您的程序输出了4 错因大概是拓扑排序后忽略了>=边和<=边
by 羊叫兽同学 @ 2023-11-10 11:02:19


@[羊叫兽同学](/user/476767) 拜谢拜谢拜谢拜谢
by August_Light @ 2023-11-10 12:54:34


|