Asteroids(poj3041)匈牙利算法

#include <iostream>
using namespace std;

bool g[505][505];
bool b[505];
int n,k;
int link[505];

bool find(int a)
{
    int i;
    for (i = 1; i <= n; ++i)
    {
        if (g[a][i] && !b[i])
        {
            b[i] = true;
            if (link[i] == 0 || find(link[i]))
            {
                link[i] = a;
                return true;
            }
        }
    }
    return false;
}
int main()
{
    scanf("%d %d", &n, &k);
    int x, y;
    int i;
    memset(g,false,sizeof(g));
    for (i = 0; i < k; ++i)
    {
        scanf("%d %d",&x, &y);
        g[x][y] = true;
    }
    memset(link,0,sizeof(link));
    int ans = 0;
    for (i = 1; i <= n; ++i)
    {
        memset(b,false,sizeof(b));
        if (find(i))
            ++ans;
    }
    cout << ans << endl;
    return 0;
}

posted @ 2011-03-06 00:41  acm_poj  阅读(191)  评论(0)    收藏  举报