判断二分图(染色法)

void solve(){
    int n,m;//n个节点,m条边
   vector<vector<int>>gh(n+1);
   for(int i=0;i<m;i++){
        int u,v;cin>>u>>v;
        gh[u].pb(v);
        gh[v].pb(u);
   }
   vector<int>color(n+1);
   auto dfs=[&](auto&&dfs,int u,int co)->bool{
         color[u]=co;//进来先标记为预期co颜色
       for(auto&v:gh[u]){
          if(color[v]==color[u]) return false;
          if(color[v]==0){//没被染色
             if(!dfs(dfs,v,3-co)){//那么递归染色这个 
                 return false;//如果返回了false 说明和父亲冲突了
             }
          }
       }
       return true;
   };
   int flag=1;
   for(int i=1;i<=n;i++){
       if(!color[i]){
         if(!dfs(dfs,i,1)){//如果为false 那么dfs后存在奇数环
             flag=0;
             break;
         }
       }
   }
   if(flag){
    YES;
   }else{
    NO;
   }
   return;
}
posted @ 2025-06-09 17:27  Qacter  阅读(4)  评论(0)    收藏  举报