完美摊位(UOJ)

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <ctype.h>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <deque>
#include <cmath>
using namespace std;
#define MAXN 20005
#define MANM 40005
struct Edge{int v,p;}e[MANM<<1];
int ecnt,h[MAXN];
void AddEdge(int u, int v){
    e[++ecnt].v=v; 
    e[ecnt].p=h[u]; h[u]=ecnt;
}

int link[MAXN],vis[MAXN],cnt;
bool Hdfs(int u){
    int v;
    for(int i=h[u];i;i=e[i].p){
        v=e[i].v;
        if(!vis[v]){
            vis[v]=1;
            if(!link[v] || Hdfs(link[v])){
                link[v]=u;
                return true;
            }
        }
    }
    return false;
}
int Hungary(int n){
    for(int i=1;i<=n;++i){
        memset(vis,0,sizeof vis);
        if(Hdfs(i))cnt++;
    }
    return cnt;
}

int n,m,k,v;
int main(){
    while(~scanf("%d %d",&n,&m)){
        memset(h,0,sizeof h); ecnt=0;
        memset(link,0,sizeof link); cnt=0;
        
        for(int i=1;i<=n;++i){
            scanf("%d",&k);
            for(int j=1;j<=k;++j){
                scanf("%d",&v);
                AddEdge(i,v);
            }
        }
        printf("%d\n",Hungary(n));
    }
    return 0;

猜你喜欢

转载自blog.csdn.net/to_more_excellent/article/details/82830185