二分图 最大匹配 60pts求调

P1330 封锁阳光大学

@[Rhss](/user/684890) ```cpp #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<queue> #include<vector> using namespace std; int n,m,c[10010],ans = 0; vector<int> adj[10010]; bool bfs() { memset(c,0,sizeof(c)); for (int u = 1;u <= n;u++) if (c[u] == 0) { int cnt1 = 1,cnt2 = 0; c[u] = 1; queue<int> q; q.push(u); while(!q.empty()) { int v = q.front(); q.pop(); for (int w:adj[v]) { if (c[w] == 0) { c[w] = -c[v]; q.push(w); if (c[w] == 1) cnt1++; else cnt2++; } else if (c[w] == c[v]) return false; } } ans += min(cnt1,cnt2); } return true; } int main() { scanf("%d%d",&n,&m); for (int i = 1;i <= m;i++) { int x,y; scanf("%d%d",&x,&y); adj[x].push_back(y); adj[y].push_back(x); } if (!bfs()) printf("Impossible\n"); else printf("%d\n",ans); return 0; } ```
by codejiahui @ 2023-05-10 13:27:18


@[Rhss](/user/684890) 不能用最小点覆盖来做,最小点覆盖中的点之间可能会有边
by shysacscsc @ 2024-01-31 23:12:38


|