HDU - 2063: 过山车

题目链接:点击打开链接

题目大意:略。

解题思路:二分图最大匹配 + 匈牙利算法。

AC 代码

#include<bits/stdc++.h>
#include<cmath>

#define mem(a,b) memset(a,b,sizeof a);
#define INF 0x3f3f3f3f

using namespace std;

typedef long long ll;
const int maxn=520;
int k,un,vn;
int vis[maxn], linker[maxn], g[maxn][maxn];

void init()
{
    mem(linker,-1);
    mem(g,0);
}

int dfs(int u)
{
    for(int i=1;i<=vn;i++)
    {
        if(!vis[i]&&g[u][i])
        {
            vis[i]=1;
            if(linker[i]==-1 || dfs(linker[i]))
            {
                linker[i]=u;
                return 1;
            }
        }
    }

    return 0;
}

int main()
{
    while(~scanf("%d",&k) && k)
    {
        scanf("%d%d",&un,&vn);
        init();
        int u,v;
        while(k--)
        {
            scanf("%d%d",&u,&v);
            g[u][v]=1;
        }

        int rs=0;
        for(int i=1;i<=un;i++)
        {
            mem(vis,0);
            if(dfs(i)) rs++;
        }
        printf("%d\n",rs);
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/dream_weave/article/details/81110004