HDU-1150 HK二分图最小点覆盖

2024-06-16 16:48
文章标签 覆盖 二分 最小 hdu 1150 hk

本文主要是介绍HDU-1150 HK二分图最小点覆盖,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


//二分图最小点覆盖 = 二分图最大匹配#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
const int maxn = 105;
const int inf = 1<<30;
int nx,ny,m;
int dis;
int map[maxn][maxn];
int cx[maxn],cy[maxn];
int dx[maxn],dy[maxn];
bool vis[maxn];//Hopcroft-Karp算法 有点类似dinic 都是先对图BFS分层再沿层数DFS找增广路
//***************************************************************************
bool searchpath()      //BFS 对二分图分层
{queue<int>que;dis = inf;memset( dx,-1,sizeof(dx) );memset( dy,-1,sizeof(dy) );for( int i = 1; i <= nx; i ++ )   //找到x集合所有未被匹配的点压入队列中{if( cx[i] == -1 ){que.push(i);dx[i] = 0;}}while( !que.empty() ){int u = que.front(); que.pop();if( dx[u] > dis )break;for( int v = 1; v <= ny; v ++ ){if( map[u][v] && dy[v] == -1 ){dy[v] = dx[u] + 1;if( cy[v] == -1 )dis = dy[v];else{dx[cy[v]] = dy[v] + 1;que.push( cy[v] );}}}}return dis != inf;
}bool findpath( int u )   //沿着层数DFS
{for( int v = 1; v <= ny; v ++ ){if( map[u][v] && !vis[v] && dy[v] == dx[u] + 1 ){vis[v] = 1;if( cy[v] != -1 && dy[v] == dis )continue;if( cy[v] == -1 || findpath( cy[v] ) ){cy[v] = u;cx[u] = v;return true;}}}return false;
}
int MaxMatch()
{int ans = 0;memset( cx,-1,sizeof(cx) );memset( cy,-1,sizeof(cy) );while( searchpath() ){memset( vis,0,sizeof(vis) );for( int i = 1; i <= nx; i ++ ){if( cx[i] == -1 ){ans += findpath( i );}}}return ans;
}
//****************************************************************int main()
{int k,x,y;while( scanf("%d",&nx ) != EOF , nx ){scanf("%d%d",&ny,&m);memset( map,0,sizeof(map) );for( int i = 1; i <= m; i++ ){scanf("%d%d%d",&k,&x,&y);map[x][y] = 1;}printf("%d\n", MaxMatch() );}
}

这篇关于HDU-1150 HK二分图最小点覆盖的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1067001

相关文章

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

vue解决子组件样式覆盖问题scoped deep

《vue解决子组件样式覆盖问题scopeddeep》文章主要介绍了在Vue项目中处理全局样式和局部样式的方法,包括使用scoped属性和深度选择器(/deep/)来覆盖子组件的样式,作者建议所有组件... 目录前言scoped分析deep分析使用总结所有组件必须加scoped父组件覆盖子组件使用deep前言

Python绘制土地利用和土地覆盖类型图示例详解

《Python绘制土地利用和土地覆盖类型图示例详解》本文介绍了如何使用Python绘制土地利用和土地覆盖类型图,并提供了详细的代码示例,通过安装所需的库,准备地理数据,使用geopandas和matp... 目录一、所需库的安装二、数据准备三、绘制土地利用和土地覆盖类型图四、代码解释五、其他可视化形式1.

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

hdu2289(简单二分)

虽说是简单二分,但是我还是wa死了  题意:已知圆台的体积,求高度 首先要知道圆台体积怎么求:设上下底的半径分别为r1,r2,高为h,V = PI*(r1*r1+r1*r2+r2*r2)*h/3 然后以h进行二分 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#includ

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

hdu 2093 考试排名(sscanf)

模拟题。 直接从教程里拉解析。 因为表格里的数据格式不统一。有时候有"()",有时候又没有。而它也不会给我们提示。 这种情况下,就只能它它们统一看作字符串来处理了。现在就请出我们的主角sscanf()! sscanf 语法: #include int sscanf( const char *buffer, const char *format, ... ); 函数sscanf()和

hdu 2602 and poj 3624(01背包)

01背包的模板题。 hdu2602代码: #include<stdio.h>#include<string.h>const int MaxN = 1001;int max(int a, int b){return a > b ? a : b;}int w[MaxN];int v[MaxN];int dp[MaxN];int main(){int T;int N, V;s

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n