1. 程式人生 > >HDU 2063 過山車

HDU 2063 過山車

二分圖,入門的題目
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>

using namespace std;
const int MAX = 505;
int g[MAX][MAX];
int used[MAX];
int r[MAX];
int k, m, n;

inline void file()
{
    freopen("D:\\he.txt", "r", stdin);
    freopen("D:\\out.txt", "w", stdout);
}

bool dfs(int x)
{
    for (int i = 1; i <= m; ++i)
    {
        if (g[x][i] == 1 && !used[i])
        {
            used[i] = 1;
            if (r[i] == 0 || dfs(r[i]))
            {
                r[i] = x;
                return true;
            }
        }
    }
    return false;
}

int main()
{
    //file();
    while (scanf("%d", &k))
    {
        if (k == 0)
            break;
        scanf("%d%d", &m, &n);
        memset(g, 0, sizeof(g));
        memset(r, 0, sizeof(r));
        int girl, boy;
        for (int i = 0; i != k; ++i)
        {
            scanf("%d%d", &girl, &boy);
            g[boy][girl] = 1;
        }
        int res = 0;
        for (int i = 1; i <= n; ++i)
        {
            memset(used, 0, sizeof(used));
            if(dfs(i))
                res++;
        }
        printf("%d\n", res);
    }
    return 0;
}