zoukankan      html  css  js  c++  java
  • POJ 1274 The Perfect Stall 水二分匹配

    主题链接:点击打开链接

    呵呵

    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<vector>
    #include<queue>
    #include<functional>
    #define N 2011
    using namespace std;
    
    int lef[N], pn;//lef[v]表示Y集的点v 当前连接的点 , pn为x点集的点数
    bool T[N];     //T[u] 表示Y集 u 是否已连接X集
    vector<int>G[N]; //匹配边  G[X集].push_back(Y集)  注意G 初始化
    
    bool match(int x){ // x和Y集 匹配 返回x点是否匹配成功
        for(int i=0; i<G[x].size(); i++)
        {
            int v = G[x][i];
            if(!T[v])
            {
                T[v] = true;
                if(lef[v] == -1 || match( lef[v] ))   //match(lef[v]) : 原本连接v的X集点 lef[v] 能不能和别人连,假设能 则v这个点就空出来和x连
                {
                    lef[v] = x;
                    return true;
                }
            }
        }
        return false;
    }
    
    int solve(){
        int ans = 0;
        memset(lef, -1, sizeof(lef));
        for(int i = 1; i<= pn; i++)//X集匹配,X集点标号从 1-pn 匹配边是G[左点].size()
        {
            memset(T, 0, sizeof(T));
            if( match( i ) ) ans++;
        }
        return ans;
    }
    int n,m;
    int main(){
        int i ,j;
    	while(~scanf("%d %d",&n,&m)){
            for(i = 1; i <= n; i++)G[i].clear();
            for(i = 1; i <= n; i++) {
                int u; scanf("%d",&u);
                while(u--){
                    scanf("%d",&j);
                    G[i].push_back(j);
                }
            }
            pn = n;
            printf("%d
    ",solve());
    	}
    	return 0;
    }
    

    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    函数和指针
    SQL Server 2005 存储过程
    位数组
    C的名字空间
    C奇特的声明
    位字段
    Git忽略规则
    常用C库简介
    《SQL Server 2005 编程入门经典》第一到十二章
    Linus:利用二级指针删除单向链表
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4871384.html
Copyright © 2011-2022 走看看