1. 程式人生 > >hdu 1054 最小頂點覆蓋

hdu 1054 最小頂點覆蓋

二分圖的最小頂點覆蓋數等於二分圖的最大匹配數

//
//  main.cpp
//  wzazzy
//
//  Created by apple on 2018/10/23.
//  Copyright © 2018年 apple. All rights reserved.
//

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string.h>
#include<queue>
#include<stack>
#include<list>
#include<map>
#include<set>
#include<vector>
using namespace std;
typedef long long int ll;
const int maxn =1500+10;
const int maxm=10000;
const int mod =1e9+7;
const int INF=0x3f3f3f3f;

vector<int>g[maxn];
bool used[maxn];
int linker[maxn];
bool dfs(int u)
{
    for(int i=0;i<g[u].size();i++)
    {
        int t=g[u][i];
        if(!used[t])
        {
            used[t]=1;
            if(linker[t]==-1||dfs(linker[t]))
            {
                linker[t]=u;
                return true;
            }
        }
    }
    return false;
}
int main(int argc, const char * argv[])
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0;i<n;i++)
        {
            int u,v;
            scanf("%d:(%d)",&u,&v);
            for(int j=0;j<v;j++)
            {
                int a;
                scanf("%d",&a);
                g[u].push_back(a);
                g[a].push_back(u);
            }
        }
        int res=0;
        memset(linker,-1,sizeof(linker));
        for(int i=0;i<n;i++)
        {
            memset(used,0,sizeof(used));
            if(dfs(i)) res++;
        }
        printf("%d\n",res>>1);
        for(int i=0;i<maxn;i++)g[i].clear();
    }
    return 0;
}

另外,這道題還可以用樹形dp和貪心做,正在研究中。。。。