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算法:

Run IDSubmit TimeJudge StatusPro.IDExe.TimeExe.MemoryCode Len.LanguageAuthor127172202015-01-17 11:14:52Accepted20630MS1824K3295 BG++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;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
原创粉丝点击