判断二分图

本文介绍了如何判断一个图是否为二分图,重点讲述了利用DFS染色和并查集的方法。在DFS染色中,如果发现相邻节点颜色相同,则图不是二分图。而在并查集解决方案中,通过寻找奇环中权值最小的边来判断,结合增广路的概念,确保敌人之间的关系正确表示,从而找到奇环。
摘要由CSDN通过智能技术生成

二分图

图中没有奇圈,那么该图是一个二分图。
判断一个图是不是二分图,只需要判断图中是否存在一个奇圈即可。

DFS染色判断二分图

原理很简单,就是采用DFS+染色的方式,如果发现相邻的两个点的颜色一样,那么我们返回改图不是二分图,否则返回是二分图。

例题

关押罪犯

#include<bits/stdc++.h>
using namespace std;

const int N=100010;
const int M=200010;
int edge[M];
int nest[M];
int last[N];
int val[M];
int cnt=2;

void add(int u,int v,int w){
   
    edge[cnt]=v;
    nest[cnt]=last[u];
    last[u]=cnt;
    val[cnt]=w;
    cnt++;
    return;
}

//二分图染色判断奇圈
int vise[N];
int mid;
bool dfs(int k,int color){
   
    vise[k]=color;
    for(int i=last[k];i;i=nest[i]){
   
        //边权剪枝
        if(val[i]<mid)continue;
        if(!vise[edge[i]]){
   
            if(!dfs(edge[i],
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值