D169 二分图判定 染色法 P1330 封锁阳光大学
D169 二分图 染色法 P1330 封锁阳光大学_哔哩哔哩_bilibili
n 个点,m 条边的无向图,问是不是二分图,如果是,求出两集合中最少的点数
思路
复习:D24【模板】二分图判定 染色法 - 董晓 - 博客园
用染色法判定有无奇环,有奇环就判无解,无奇环要记录一下两种染色集合的点数,注意累加
如图,不连通,累加黑色点的数量,放河蟹

// 二分图 染色法 O(n+m) #include<bits/stdc++.h> using namespace std; const int N=10010,M=200010; int h[N],to[M],ne[M],idx; void add(int a,int b){ to[++idx]=b; ne[idx]=h[a]; h[a]=idx; } int n,m,color[N]; int a,b,ans; bool dfs(int u,int c){ color[u]=c; c==1?++a:++b; //统计两部点数 for(int i=h[u];i;i=ne[i]){ int v=to[i]; if(!color[v]){ if(dfs(v,3-c)) return 1; //有奇环,1 } else if(color[v]==c) return 1; //有奇环,1 } return 0; //无奇环,0 } int main(){ cin>>n>>m; for(int i=0;i<m;i++){ cin>>a>>b;add(a,b);add(b,a); } for(int i=1;i<=n;i++)if(!color[i]){ a=b=0; if(dfs(i,1)){ puts("Impossible"); return 0; } ans+=min(a,b); //累加最少点数 } cout<<ans; return 0; }
浙公网安备 33010602011771号