首页 > 其他分享 >二部图

二部图

时间:2023-07-11 12:13:58浏览次数:51  
标签:head return int ed 二部 qu ptop

二分图(二部图)

概念:可分为两个集合,集合内的点无边相连的图

判定:染色法

int col[MAXN];
vector<int> ed[MAXN];
bool bfs(){
	col[1] = 1;
	queue<int> qu;
	while(!qu.empty()){
		int u = qu.front();
		qu.pop();
		for(auto v:ed[u]){
			if(!col[v]){
				col[v] = 2 - col[u];
				qu.push(v);
			}else if(col[v] == col[u])
				return 0;
		}
	}
	return 1;
}

无权二部图最大匹配问题

  • 匹配:每个节点都只连一条边的边集合

转换为最大流问题

  • 设置一个起点,连接集合S的所有点,权值为1,设置一个终点,连接集合T的所有点,权值为1,求最大匹配等价于求起点到终点的最大流
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e3 + 20,MAXE = 5e4 + MAXN;
#define inf 0x3f3f3f3f
struct edge{
	int v,w;
	int i;
	edge* nex;
}ed[MAXE*2];
edge* head[MAXN];
int ptop = 0;
void add(int u,int v){
	ed[ptop].v = v;
	ed[ptop].w = 1;
	ed[ptop].nex = head[u];
	head[u] = &ed[ptop];
	ed[ptop].i = ptop;
	ptop++;
	ed[ptop].v = u;
	ed[ptop].w = 0;
	ed[ptop].nex = head[v];
	head[v] = &ed[ptop];
	ed[ptop].i = ptop;
	ptop++;
}
int d[MAXN];
int s = 0,t;
bool bfs(){
	queue<int> qu;
	qu.push(s);
	memset(d,-1,sizeof(d));
	d[s] = 0;
	while(!qu.empty()){
		int u = qu.front();
		qu.pop();
		edge* p = head[u];
		while(p != NULL){
			int v = p -> v;
			if(p -> w && d[v] == -1){
				d[v] = d[u] + 1;
				qu.push(v);
			}
			p = p -> nex;
		}
	}
	if(d[t] == -1)
		return 0;
	else
		return 1;
}
int dfs(int u,int flow){
	edge* p = head[u];
	if(u == t)
		return flow;
	int use = 0;
	while(p != NULL){
		int v = p -> v;
		if(d[v] == d[u] + 1 && p -> w){
			int tem = dfs(v,min(flow,p -> w));
			use += tem;
			flow -= tem;
			ed[p -> i].w -= tem;
			ed[(p -> i)^1].w += tem;
			if(flow == 0)
				break;
		}
		p = p -> nex;
	}
	if(use == 0)
		d[u] = -1;
	return use;
}
int dinic(){
	int ans = 0;
	while(bfs()){
		ans += dfs(s,inf);
	}
	return ans;
}
int main()
{
	int n,m,e;cin >> n >> m >> e;
	for(int i = 1;i <= n;i++)
		add(s,i);
	t = n + m + 1;
	for(int i = 1 + n;i < t;i++)
		add(i,t);
	for(int i = 1;i <= e;i++)
	{
		int u,v;cin >> u >> v;
		v += n;
		add(u,v);
	}
	cout << dinic();
}

标签:head,return,int,ed,二部,qu,ptop
From: https://www.cnblogs.com/xxcdsg/p/17544282.html

相关文章

  • 微信小程序 案例练手 第二部分
    中国石油大学华东新生指南效果展示点击首页的gird点击外出页的gird地图页(还没做完),话说微信的破导航,偏的也太多了,根本不准啊点击首页gird跳转建新的页面(为我真的懒得分包了,外加多弄页面增加我的工作量了)那就把那堆grid跳转到同一个页面吧。不过和上次的处理不一样。......
  • SpringCloud第二部分(Gateway、Douker)
    统一网关Gateway为什么需要网关​ API网关作用就是把各个服务对外提供的API汇聚起来,让外界看起来是一个统一的接口。同时也可在网关中提供额外的功能。分布式服务架构、微服务架构与API网关:​ 在微服务架构里,服务的粒度被进一步细分,各个业务服务可以被独立的设计、开发、测......
  • 关于软件构造第二部分(PPT4-8)的总结复习
    一、基本数据类型、对象数据类型基本数据类型:int、long、boolean、double等,——有值,无ID,无法区分,不可变,在栈中分配内存,代价低;对象数据类型:String、Date等——有值,有ID,可为可变也可为不可变,在堆中分配内存,代价昂贵;可将基本数据类型包装为动态数据类型(首字母变大写)通常在定义集合......
  • Unreal Engine 大象无形学习笔记(第二部分:虚幻引擎浅析)
     Q1.虚幻引擎的Main函数在哪?LaunchWindows.cpp中找到WinMain。Q2.虚幻引擎为什么要引入模块机制?编辑器模式、发布模式要单独配置非常麻烦。工具:UnrealBuildTool包含大模块:Runtime、Development、Editor、Plugin每个模块包含:Public、Private文件夹,.build.cs文件作用......
  • SQLiteManager 第二部分
    //一些常用的查询方法(其实如果熟悉SQL的话,直接用ExecuteQuery更方便)//这部分直接复制到SQLiteManager类里面就可以//SQLite没有逻辑型,一般用0/1表示//在比照文本型时,别忘了手动给string参数值加上单引号publicList<TableColInfo>GetTableColInfos(stringtable......
  • 离散数学第二版(屈婉玲)第二部分内容总结
    第二部分 集合论总结第6章 集合代数6.1集合的基本概念集合中的关系:元素和集合之间:属于或不属于。集合与集合之间:包含被包含,子集,真子集,空集,幂集。 6.2集合的运算集合的基本运算:并、交、相对补、对称差、绝对补 ......
  • 离散数学第二部分内容总结
    前言:  高中对集合已经有过学习,像基本概念,一些基础的运算都有学习过,这部分的内容比较简单,重点要理清楚二元关系中的概念,容易弄混的地方要牢记。集合的基本概念:  1.集合的基本概念:   集合是“确定的一堆东西”,集合里的“东西”则称为元素。现代的集合一般被定义为:由一个......
  • pta第二部分总结oop训练集05-06
    (1)前言训练集05:(题量适中,难度适中)7-5:多个类的互相调用对于日期类的整体优化,聚合初体验。7-6:对7-5的优化,加强聚合训练。训练集06:(题量少,难度大)7-1:多需求的实现。(完成的不好,编程能力还不够)(2)设计与分析7-5:类图: 源码:importjava.util.Scanner;publicclassMain{......
  • 精通 Python OpenCV4:第二部分
    原文:MasteringOpenCV4withPython协议:CCBY-NC-SA4.0译者:飞龙本文来自【ApacheCN计算机视觉译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。当别人说你没有底线的时候,你最好真的没有;当别人说你做过某些事的时候,你也最好真的做过。第2部分:OpenCV中的图像处理在本......
  • TensorFlow 2.0 的新增功能:第一、二部分
    原文:What'sNewinTensorFlow2.0协议:CCBY-NC-SA4.0译者:飞龙本文来自【ApacheCN深度学习译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。不要担心自己的形象,只关心如何实现目标。——《原则》,生活原则2.3.c第1部分:TensorFlow2.0-架构和API更改本书的这一部......