• HDU 2119 Matrix 简单二分匹配


    版权声明:本文为博主原创文章,未经博主同意不得转载。 https://blog.csdn.net/qq574857122/article/details/37961953

    行做x集,列做y集,1就给该行该列连一条边,输出最大匹配边就可以

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
    #include<vector>
    #include<set>
    using namespace std;
    #define N 105
    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 mp[N][N];
    int main(){
        int i, j;
        while(scanf("%d",&n), n){
            scanf("%d",&m);
            for(i = 1; i <= n; i++)
                for(j = 1; j <= m; j++)
                scanf("%d",&mp[i][j]);
            for(i = 1; i <= n; i++)
                G[i].clear();
            pn = n;
            for(i = 1; i <= n; i++)
                for(j = 1; j <= m; j++)
                if(mp[i][j])
                    G[i].push_back(j);
            printf("%d
    ", solve());
        }
        return 0;
    }
    


  • 相关阅读:
    python字符串,数组操作
    python爬虫之有道在线翻译
    英雄联盟界面
    学习photoshop心得
    linux命令总结之lsof命令
    linux命令总结之netstat命令
    linux命令总结之route命令
    linux命令总结之ip命令
    linux命令总结之dig命令
    IP地址的分类——a,b,c 类是如何划分的
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10945424.html
Copyright © 2020-2023  润新知