POJ 1466 Girls and Boys 二分图

题目描述是,有n个男生和n女生。(编号0-n-1)

输入一个的编号,后面对应是与之有浪漫关系的人的编号。

找出最大的没有浪漫关系人的数量,即最大独立集。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <stack>
#include <map>
#include <iomanip>
#define PI acos(-1.0)
#define Max 2005
#define inf 1<<28
using namespace std;
int n;
vector<int>g[Max];
bool visit[Max];
int match[Max];
int DFS(int cur)//增广轨
{
    int i,j;
    for(i=0; i<g[cur].size(); i++)
    {
        int k=g[cur][i];
        if(!visit[k])
        {
            visit[k]=1;
            if(match[k]==-1||DFS(match[k]))
            {
                match[k]=cur;
                return 1;
            }
        }
    }
    return 0;
}
void init()
{
    int i;
    for(i=0; i<=n; i++)
    {
        g[i].clear();
    }
}
int solve()//最大匹配
{
    int i,num=0;
    for(i=1;i<=n;i++)
    {
        memset(visit,0,sizeof(visit));
        num+=DFS(i);
    }
    return num;
}
int main()
{
    int i,j,k,l,m;
    int girl,boy;
    char kuohao1,kuohao2,maohao;
    while(scanf("%d",&n)!=EOF)
    {
        memset(match,-1,sizeof(match));
        init();
        for(i=0; i<n; i++)
        {
            scanf("%d: (%d)",&girl,&m);//输入处理比较繁琐
            while(m--)
            {
                scanf("%d",&boy);
                g[girl+1].push_back(boy+1);//STL邻接表存储二分图信息
            }
        }
        cout<<n-solve()/2<<endl;//无向图:最大独立集=总点数-最大匹配/2;
    }
    return 0;
}


你可能感兴趣的:(存储)