zoukankan      html  css  js  c++  java
  • 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;
    }



  • 相关阅读:
    页脚保持在未满屏页面的底部
    jquery tab选项卡
    Unity 物体在屏幕内跟随鼠标移动
    Unity 中一些图形学知识
    Unity 简单的第三人称视角
    Unity 一个简单的鼠标跟随
    Unity常用操作代码
    3D渲染管线
    教你如何利用threejs对3D模型皮肤进行DIY
    从Maya中把模型搬运至网页的过程
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/7008156.html
Copyright © 2011-2022 走看看