首页 > 其他分享 >二分图

二分图

时间:2024-05-14 10:11:54浏览次数:11  
标签:二分 nxt return int tot maxn now

关于二分图

判断是否为二分图

左部和右部的点之间不存在连边,即不存在奇环;
image

codes

点击查看代码
#include<bits/stdc++.h>
using namespace std;

const int maxn=1e5+10;

int n,m,tot;
int to[maxn*2],nxt[maxn*2],w[maxn*2],h[maxn];
int col[maxn],x[maxn],y[maxn],z[maxn];

inline void add(int x,int y,int z)
{
	to[++tot]=y;
	nxt[tot]=h[x];
	h[x]=tot;
	w[tot]=z;
}

bool dfs(int now,int fa,int color)
{
	col[now]=color;
	for(int i=h[now];i;i=nxt[i])
	{
		if(to[i]==fa)continue;
		if(col[to[i]]==color)return false;
		if(!col[to[i]] and !dfs(to[i],now,3-color))return false;
	}
	return true;
}

inline bool judge()
{
	for(int i=1;i<=n;i++)
	{
		if(!col[i])
		{
			if(!dfs(i,0,1))return false;
		}
	}
	return true;
}

int main()
{
	ios::sync_with_stdio(false);
	
	//读入建图
    if(judge())cout <<"yes";
    else cout <<"no";
	
	return 0;
}

二分图应用(匈牙利算法)

点击查看代码
#include<bits/stdc++.h>
using namespace std;

const int maxn=3000;

int n,m,tot;
int h[maxn],to[maxn],nxt[maxn];
int match[maxn];
bool vis[maxn];

inline void add(int x,int y)
{
	to[++tot]=y;
	nxt[tot]=h[x];
	h[x]=tot;
}

bool dfs(int now)
{
	for(int i=h[now];i;i=nxt[i])
	{
		int v=to[i];
		if(vis[v])continue;
		vis[v]=true;
		if(!match[v] or dfs(match[v]))
		{
			match[v]=now;
			return true;
		}
	}
	return false;
}

inline int xyl()
{
	int ans=0;
	for(int i=1;i<=m;i++)
	{
		memset(vis,0,sizeof vis);
		if(!dfs(i))return i-1;
	}
	return m;
}

int main()
{
	ios::sync_with_stdio(false);
	
	//读入建边
	int ans=xyl();
	cout <<ans;
	
	
	return 0;
}

二分图详解

更多详解

标签:二分,nxt,return,int,tot,maxn,now
From: https://www.cnblogs.com/wang-qa/p/18190673

相关文章

  • 高一下三调模拟赛5.13(附关于二分图匈牙利建边的详细思考)
    前言注:本篇为知识性内容,A题附详解关于匈牙利算法求最大独立子集难以理解的建边问题的思考,若有不当之处感谢指出。暂时只写了A篇题解,以供帮助大家理解相关问题,剩余题解会进行补充。又是小集训的一周,总要伴随着模拟赛...还是五道题目:A.攻击装置B.循环C.漫步D.穿越E.结......
  • 二分图
    二分图总结一是太长时间不写博客,觉得对不起这个账号二是记录一下对二分图的建边和含义的理解首先我们要知道二分图的三个性质1.二分图的一组匹配M是最大匹配,当且仅当图中不存在M的增广路。2.二分图中最小点覆盖数=最大匹配数3.二分图中最大独立集数=n-最小点覆盖数、......
  • # 如何优雅的写出二分
    二分查找二分法查找单个值题目:给定一个n个有序的(升序)数组nums和一个目标值target,写一个函数搜索nums中target,如果目标值存在返回下标,否则返回-1;关键词:有序数组,无重复元素难点:区间选择及循环不变量在每次循环中要坚持循环不变量原则(名字不重要,怎么做很重要)  如果我们在......
  • 二分图(例题)
    https://www.cnblogs.com/kuangbiaopilihu/p/18184536$\quad$这里不再介绍二分图的基础知识,只是一些例题的解释。$\quad$当然,这道题可以用二分+并查集来解决。但这是二分图专辑,所以介绍一下二分图做法。$\quad$首先如果两个罪犯之间有仇恨,那么当他们不在同一......
  • 洛谷 P2824 [HEOI2016/TJOI2016] 排序(二分,线段树)
    传送门解题思路据说是经典思路:把多次排序转化成二分+01序列。首先二分所求位置的数字是啥,将大于mid的数字变成1,将小于等于mid的数字变成0。这样在排序的时候就相当于统计区间里的1的个数(区间和),然后区间全部变成0或者1。也就是区间修改,区间求和,线段树可以实现。AC代码#inclu......
  • 匈牙利算法模板(二分图)
    booldfs(intnow){for(inti=h[now];i;i=nxt[i]){intt=to[i];//这里不用考虑会有回到父结点的边的问题//因为每次都是从左部找邻接点if(!vis[t]){vis[t]=true;//如果邻接点t是非匹配点,则找到一条增广路,匹配......
  • 加练日记2-二分,双指针,排序
    二分模板 #include<bits/stdc++.h>usingnamespacestd;usingll=longlong;constllMOD=998244353;lln,m;constllN=2e5+9;lla[N];llv[N];intf(llmid){ llans=0,pre=-1e9; for(inti=1;i<=n;i++){ if(a[i]-pre>=mid)ans++,pre=a[i......
  • 蓝桥杯-递增三元组(三种解法,二分, 双指针, 前缀和)
    给定三个整数数组A=[A1,A2,…AN],B=[B1,B2,…BN],C=[C1,C2,…CN],请你统计有多少个三元组(i,j,k)满足:1≤i,j,k≤NAi<Bj<Ck输入格式第一行包含一个整数N。第二行包含N个整数A1,A2,…AN。第三行包含N个整数B1,B2,…BN。第四行包含N个整数C1,C2,…CN。输出格......
  • 二分图
    1.二分图的概念二分图,又称二部图,英文名叫Bipartitegraph。如果一张无向图的\(N\(N≥2)\)个节点,可以分成A、B两个非空集合,其中\(A∩B=Φ\),并且在同一集合内的点之间都没有边相连,那么称这张无向图为一张二分图。A、B分别称为二分图的左部和右部。如下图所示。2.二......
  • 代码随想录算法训练营第第一天 | 704. 二分查找 、27. 移除元素
    704、二分查找题目链接:https://leetcode.cn/problems/binary-search/文章讲解:https://programmercarl.com/0704.二分查找.html视频讲解:https://www.bilibili.com/video/BV1fA4y1o715`varsearch=function(nums,target){letleft=0;letright=nums.length;letmi......