HDOJ 2063 过山车
来源:互联网 发布:大数据就业岗位环境 编辑:程序博客网 时间:2024/05/22 00:33
题意:给出3个数,分别为n,a,b;n表示有n种配对模式,a表示女生的数量,b表示男生的数量;n种匹配模式中每个a可以与b配对,求最大的匹配数。
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2063
思路:a与b两个独立的点集,求最大的匹配数。二分图最大匹配数模板题。
注意点:忘记清空g数组,无限WA
以下为AC代码:
(1)Hopcroft-Karp算法:
#include <iostream>#include <cstdio>#include <string>#include <cstring>#include <vector>#include <deque>#include <list>#include <cctype>#include <algorithm>#include <climits>#include <queue>#include <stack>#include <cmath>#include <map>#include <set>#include <iomanip>#include <cstdlib>#include <ctime>#define ll long long#define ull unsigned long long#define all(x) (x).begin(), (x).end()#define clr(a, v) memset( a , v , sizeof(a) )#define pb push_back#define mp make_pair#define read(f) freopen(f, "r", stdin)#define write(f) freopen(f, "w", stdout)using namespace std;const double pi = acos(-1);const int MAXN = 5000;int n1, n2;vector<int> g[MAXN+10];int mx[MAXN+10], my[MAXN+10];queue<int> que;int dx[MAXN+10], dy[MAXN+10];bool vis[MAXN+10];bool find ( int u ){ for ( int i = 0; i < g[u].size(); i ++ ){ if ( ! vis[g[u][i]] && dy[g[u][i]] == dx[u] + 1 ){ vis[g[u][i]] = true; if ( ! my[g[u][i]] || find( my[g[u][i]] ) ){ mx[u] = g[u][i]; my[g[u][i]] = u; return true; } } } return false;}int matching(){ memset ( mx, 0, sizeof ( mx ) ); memset ( my, 0, sizeof ( my ) ); int ans = 0; while ( true ){ bool flag = 0; while ( ! que.empty() ) que.pop(); memset ( dx, 0, sizeof ( dx ) ); memset ( dy, 0, sizeof ( dy ) ); for ( int i = 1; i <= n1; i ++ ){ if ( ! mx[i] ) que.push(i); } while ( ! que.empty() ){ int u = que.front(); que.pop(); for ( int i = 0; i < g[u].size(); i ++ ){ if ( ! dy[g[u][i]] ){ dy[g[u][i]] = dx[u] + 1; if ( my[g[u][i]] ){ dx[my[g[u][i]]] = dy[g[u][i]] + 1; que.push( my[g[u][i]] ); }else{ flag = true; } } } } if ( ! flag )break; memset ( vis, 0, sizeof ( vis ) ); for ( int i = 1; i <= n1; i ++ ){ if ( ! mx[i] && find(i) ) ans ++; } } return ans;}int main(){ ios::sync_with_stdio( false ); int k; while ( cin >> k && k ){ for ( int i = 0; i < MAXN; i ++ ) g[i].clear(); cin >> n1 >> n2; int a, b; for ( int i = 0; i < k; i ++ ){ cin >> a >> b; g[a].push_back ( b ); } cout << matching() <<endl; } return 0;}
(2)匈牙利算法:Run IDSubmit TimeJudge StatusPro.IDExe.TimeExe.MemoryCode Len.LanguageAuthor127167702015-01-17 10:43:01Accepted206315MS1756K3294BG++luminous11
#include <iostream>#include <cstdio>#include <string>#include <cstring>#include <vector>#include <deque>#include <list>#include <cctype>#include <algorithm>#include <climits>#include <queue>#include <stack>#include <cmath>#include <map>#include <set>#include <iomanip>#include <cstdlib>#include <ctime>#define ll long long#define ull unsigned long long#define all(x) (x).begin(), (x).end()#define clr(a, v) memset( a , v , sizeof(a) )#define pb push_back#define mp make_pair#define read(f) freopen(f, "r", stdin)#define write(f) freopen(f, "w", stdout)using namespace std;const double pi = acos(-1);const int MAXN = 5000;int n1, n2;int from[MAXN+10];bool use[MAXN+10];int tot;bool match ( int x ){ for ( int i = 0; i < g[x].size(); ++i ){ if ( ! use[g[x][i]] ){ use[g[x][i]] = true; if ( from[g[x][i]] == 0 || match ( from[g[x][i]] ) ){ from[g[x][i]] = x; return true; } } } return false;}int hungary() { tot = 0; memset ( from, 0, sizeof ( from ) ); for ( int i = 1; i <= n2; i ++ ){ memset ( use, 0, sizeof ( use ) ); if ( match(i) ){ tot ++; } } return tot;}int main(){ ios::sync_with_stdio( false ); int k; while ( cin >> k && k ){ for ( int i = 0; i < MAXN; i ++ ) g[i].clear(); cin >> n1 >> n2; int a, b; for ( int i = 0; i < k; i ++ ){ cin >> a >> b; g[a].push_back ( b ); } cout << hungary() <<endl; } return 0;}
0 0
- ACM HDOJ 2063 (过山车)
- HDOJ 2063 过山车
- HDOJ 2063 过山车
- hdoj 2063 过山车
- HDOJ 过山车 2063
- 【HDOJ 2063】过山车
- hdoj 2063 过山车
- HDOJ 2063 过山车
- hdoj 2063 过山车
- hdoj 2063 过山车
- HDoj-2063-过山车-匈牙利算法
- HDOJ 2063-过山车【匈牙利算法】
- HDOJ 2063 过山车(二分匹配)
- HDOJ过山车
- HDOJ 2063 过山车(二分图匹配)
- HDOJ 2063 过山车 (二分图匹配)
- hdoj--2063--过山车(最大匹配)
- hdoj 过山车 2063 (二分图最大匹配)
- 白话大数据——大数据算法:白话遗传算法
- Android中自定义属性的格式详解
- c/c++调用java 第一篇
- iOS开发相关网址
- onvif 上手(一)
- HDOJ 2063 过山车
- php基础教程——3cookie和session
- 修复/lib/ld-linux.so.2: bad ELF interpreter: No such file or directory问题
- [ASP.NET-VI] 发布ASP.NET网站(Windows IIS + SQL Server 2008 + VS2008)
- Sencha touch 基础学习
- iOS开发之多媒体播放
- Win32 SDC 编程
- (5119)HDU-类背包
- arcgis脚本Python批量裁切与统计实现