1 solutions

  • 0
    @ 2025-11-5 17:27:31

    C++ :

    //AUTHOR::STDAFX
    //ALGORITHM::Hungary
    
    #define MAXN 2010UL
    #define MAXQ 2000010UL
    
    #include <cstdio>
    #include <cstring>
    
    using namespace std;
    
    void Work();
    inline void Build(int,int);
    bool dfs(int);
    
    struct Edge{
        int v,nx;
    };
    
    Edge edge[MAXQ];
    
    int link[MAXN],headlist[MAXN],gs,node,pt,ans,edge_cs,n;
    bool used[MAXN];
    
    int main(){
        while(~scanf("%d",&n)){
            Work();
        }
        return 0;
    }
    
    inline void Build(int u,int v){
        edge[++edge_cs].v=v;
        edge[edge_cs].nx=headlist[u];
        headlist[u]=edge_cs;
        return;
    }
    
    bool dfs(int u){
        for(int i=headlist[u];i!=-1;i=edge[i].nx){
            if(!used[edge[i].v]){
                used[edge[i].v]=1;
                if(link[edge[i].v]==-1||dfs(link[edge[i].v])){
                    link[edge[i].v]=u;
                    return true;
                }
            }
        }
        return false;
    }
    
    void Work(){
        memset(link,-1,sizeof(link));
        memset(headlist,-1,sizeof(headlist));
        ans=0;edge_cs=0;
        for(int i=0;i<n;i++){
            scanf("%d%d",&node,&gs);
            for(int j=1;j<=gs;j++){
                scanf("%d",&pt);
                Build(node,pt);
                Build(pt,node);
            }
        }
        for(int i=0;i<n;i++){
            memset(used,0,sizeof(used));
            if(dfs(i)){
                ans++;
            }
        }
        printf("%d\n",ans>>1);
        return;
    }
    
    • 1

    Information

    ID
    18449
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By