HDU 1281 棋盤遊戲(二分圖匹配)
阿新 • • 發佈:2020-08-18
解題思路
因為每行每列只能放一個棋子,所以這就是一個匹配問題,每一行最多就只能匹配一列。題目問那些棋子去掉之後最大匹配數會變少,直接列舉就行了。
程式碼
vector<int> e[maxn], re[maxn]; int deep[maxn], sz[maxn], rec[maxn]; ll sum; void dfs(int u, int p, int k) { ++sz[u]; deep[u] = k; for (auto v : e[u]) if (v!=p) { dfs(v, u, k+1); sz[u] += sz[v]; } sum += sz[u]; } ll dfs2(int u, int p) { if (rec[u]) return rec[u]; ll res = 0; for (auto v : re[u]) if (v!=p) res += dfs2(v, u); return rec[u] = res + sz[u]; } int main() { int t; scanf("%d", &t); while(t--) { int n; scanf("%d", &n); if (n==1) { printf("1\n"); continue; } for (int i = 2, a; i<=n; ++i) { scanf("%d", &a); e[a].push_back(i); re[i].push_back(a); } sum = 0; dfs(1, -1, 1); ll ans = -1; for (int i = 2; i<=n; ++i) { ll k = dfs2(i, -1); ans = max(ans, sum+(ll)deep[i]*n-k); } printf("%lld\n", ans); for (int i = 0; i<=n; ++i) { e[i].clear(); re[i].clear(); deep[i] = 0; sz[i] = 0; rec[i] = 0; } } return 0; }