博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
简单二分图匹配
阅读量:4616 次
发布时间:2019-06-09

本文共 3021 字,大约阅读时间需要 10 分钟。

1.HDU 2063 过山车

模板题。。

View Code
#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std; int color[1100]; int match[1100]; int mp[1100][1100]; int leftnum, rightnum; void init( ) { for( int i = 1; i <= 1000; i++) { color[i] = 0; match[i] = -1; } for( int i = 1; i <= 1000; i++) { for( int j = 1; j <= 1000; j++) mp[i][j] = 0; } } int find( int x) { for( int i = 1; i <= rightnum; i++) { if (!color[i] && mp[x][i]) { color[i] = 1; if (match[i] == -1 || find(match[i])) { match[i] = x; return 1; } } } return 0; } int solve( ) { int cnt = 0; for( int i = 1; i <= leftnum; i++) { memset(color, 0, sizeof(color)); if ( find(i) ) cnt++; } return cnt; } int main( ) { int k, M, N, a, b; while ( scanf("%d", &k), k) { scanf("%d%d", &M, &N); init( ); leftnum = rightnum = 0; for( int i = 1; i <= k; i++) { scanf("%d%d", &a, &b); mp[a][b] = 1; if (a > leftnum ) leftnum = a; if (b > rightnum ) rightnum = b; } printf("%d\n", solve( )); } return 0; }

2.HDU 2444

要判断能不能构成二分图。。构好图。

然后就直接用匈牙利算法就可以了

View Code
#include 
#include
#include
int left[1000], right[1000], ld, rd; int mp[300][300]; int match[300]; int color[300]; void init( ) {
memset(left, 0, sizeof(left)); memset(right, 0, sizeof(right)); memset(match, -1, sizeof(match)); memset(mp, 0, sizeof(mp)); ld = 0, rd = 0; } int find( int x ) {
for( int j = 1; j < rd; j++) {
int i = right[j]; //printf("color = %d mp = %d\n",mp[x][i], color[i]); if( mp[x][i] && !color[i] ) {
color[i] = 1; //puts("A"); if( match[i] == -1 || find(match[i])) {
match[i] = x; return 1; } } } return 0; } void solve( ) {
int cnt = 0; for( int j = 1; j < ld; j++) {
int i = left[j]; memset(color, 0, sizeof(color)); if( find(i) ) cnt++; } printf("%d\n", cnt); } int main( ) {
int N, M, a, b; while( scanf("%d%d",&N, &M) != EOF ) {
init( ); int x = 0; for( int i = 1; i <= M; i++) {
scanf("%d%d",&a,&b); mp[a][b] = mp[b][a] = 1; int f1 = 0, f2 = 0; if( !left[a] && !right[a]) left[a] = 1, f1 = 1, ld++; if( !left[a] && !right[b] && !f1) left[b] = 1, f2 = 1, ld++; if( !left[a] && !right[a] && !f1) right[a] = 1, rd++; if( !left[b] && !right[b] && !f2) right[b] = 1, rd++; if( (left[a] && left[b]) || (right[a] && right[b] )) x = 1; } // printf("%d \n", x); if( x == 1 || ld == N || rd == N ) {
puts("No"); continue; } ld = rd = 1; //X集合 for( int i = 1; i <= N; i++) if( left[i] ) left[ld++] = i; //Y集合 for( int i = 1; i <= N; i++) if( right[i] ) right[rd++] = i; solve( ); } }

转载于:https://www.cnblogs.com/tangcong/archive/2012/03/07/2384332.html

你可能感兴趣的文章
易之 - 我是个大师(2014年3月6日)
查看>>
Delphi中窗体的事件
查看>>
file_get_contents()获取https出现这个错误Unable to find the wrapper “https” – did
查看>>
linux vi编辑器
查看>>
js树形结构-----(BST)二叉树增删查
查看>>
contract
查看>>
FJUT ACM 1899 Largest Rectangle in a Histogram
查看>>
如何删除xcode项目中不再使用的图片资源
查看>>
编写用例文档
查看>>
解决WPF两个图片控件显示相同图片因线程占用,其中一个显示不全的问题
查看>>
寻觅Azure上的Athena和BigQuery (二):神奇的PolyBase
查看>>
编程题练习
查看>>
mac os安装vim74
查看>>
Linux内存管理原理
查看>>
Java 8 Lambda 表达式
查看>>
BZOJ-3289 Mato的文件管理
查看>>
自旋锁和互斥锁的区别
查看>>
react混合开发APP,资源分享
查看>>
入门篇
查看>>
【洛谷1829】 [国家集训队] Crash的数字表格(重拾莫比乌斯反演)
查看>>