D169 二分图判定 染色法 P1330 封锁阳光大学

D169 二分图 染色法 P1330 封锁阳光大学_哔哩哔哩_bilibili

 

P1330 封锁阳光大学 - 洛谷

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;
}
 

 

posted @ 2026-05-26 16:46  董晓  阅读(64)  评论(0)    收藏  举报