• Light OJ 1373 Strongly Connected Chemicals 二分匹配最大独立集


    m种阳离子 n种阴离子 然后一个m*n的矩阵 第i行第j列为1代表第i种阴离子和第j种阴离子相互吸引 0表示排斥

    求在阳离子和阴离子都至少有一种的情况下 最多存在多少种离子能够共存

    阴阳离子都至少须要存在一种 那么能够枚举哪2种离子共存 如果枚举a b 然后找到全部的和a能够共存的阴离子(设为x集合)以及和b共存的阳离子(设为y集合) 

    如今仅仅需求x集合中和y集合中最多有多少个离子能够共存 这个求最大独立集即可了 枚举全部的a b 取最大值

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <vector>
    using namespace std;
    const int maxn = 55;
    int vis[maxn];
    int y[maxn];
    vector <int> G[maxn];
    int n, m;
    
    char a[maxn][maxn];
    bool dfs(int u)
    {
    	for(int i = 0; i < G[u].size(); i++)
    	{
    		int v = G[u][i];
    		if(vis[v])
    			continue;
    		vis[v] = true;
    		if(y[v] == -1 || dfs(y[v]))
    		{
    			y[v] = u;
    			return true;
    		}
    	}
    	return false;
    }
    int match()
    {
    	int ans = 0;
    	memset(y, -1, sizeof(y));
    	for(int i = 0; i < n; i++)
    	{
    		memset(vis, 0, sizeof(vis));
    		if(dfs(i))
    			ans++;
    	}
    	return ans;
    }
    int main()
    {
    	int T;
    	int cas = 1;
    	scanf("%d", &T);
    	while(T--)
    	{
    		scanf("%d %d", &n, &m);
    		for(int i = 0; i < n; i++)
    			scanf("%s", a[i]);
    		int ans = 0;
    		for(int i = 0; i < n; i++)
    			for(int j = 0; j < m; j++)
    				if(a[i][j] == '1')
    				{
    					int sum1 = 0, sum2 = 0;
    					for(int h = 0; h < m; h++)
    						if(a[i][h] == '1')
    							sum1++;
    					for(int h = 0; h < n; h++)
    						if(a[h][j] == '1')
    							sum2++;
    					if(ans >= sum1+sum2)
    						continue;
    					for(int h = 0; h < n; h++)
    					{
    						G[h].clear();
    						if(a[h][j] == '1')
    						{
    							for(int k = 0; k < m; k++)
    								if(a[i][k] == '1' && a[h][k] == '0')
    									G[h].push_back(k);
    						}
    					}
    					int res = match();
    					if(sum1+sum2-res > ans)
    						ans = sum1+sum2-res;
    				}
    		printf("Case %d: %d
    ", cas++, ans);
    			
    	}
    	return 0;
    }



  • 相关阅读:
    【BZOJ1015】星球大战starwar
    【BZOJ1878】HH的项链
    【BZOJ1012】最大数maxnumber
    【BZOJ3767】A+B Problem加强版
    【BZOJ1406】密码箱
    【BZOJ1067】降雨量
    【BZOJ1305】dance跳舞
    【BZOJ1509】逃学的小孩
    【BZOJ1103】大都市meg
    【BZOJ3262】陌上花开
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/7008156.html
Copyright © 2020-2023  润新知