【二分图】 poj 1466

#include <iostream>

#include <memory.h>

#include <cstdio>

using namespace std;

int c;

const int maxn=502;

int visit[maxn],map[maxn][maxn],link[maxn];

bool DFS(int a)

{

    for(int i=0;i<c;i++)

    {

        if(!visit[i] && map[a][i])

        {

            visit[i]=1;

            if(link[i]==-1 || DFS(link[i]))

            {

                link[i]=a;

                return true;

            }

        }

    }

    return false;

}

int main()

{

//    freopen("in.txt","r",stdin);

    int x,y,tmp;

    while(cin >> c)

    {

        memset(map,0,sizeof(map));

        memset(link,-1,sizeof(link));

        for(int i=0;i<c;i++)

        {

            scanf("%d: (%d)",&x,&y);

            for(int j=0;j<y;j++)

            {

                scanf("%d",&tmp);

                map[i][tmp]=1;

            }

        }

        int sum=0;

        for(int i=0;i<c;i++)

        {

            memset(visit,0,sizeof(visit));

            if(DFS(i))sum++;

        }

        cout << c-sum/2 <<endl;

    }

     return 0;

}

 

你可能感兴趣的:(poj)