zoukankan      html  css  js  c++  java
  • hdu 149850 years, 50 colors 最大匹配

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1498

    /*
      题意:
      给你一个n*n的矩阵,在矩阵中分布着s种颜色的气球,给你k次扎破气球 
      的操作,每次操作可以扎破一行,或一列的同一颜色的气球。问在k次操 
      作后有那几种颜色的气球是不能被完全扎破的. 
      解题思路:
      使用二部图最大匹配,寻找每种颜色的最大匹配数,(行,列分别为两个匹配)
      如果都在m次内可以被刺破,则输出 -1 否则的话,按不能被刺破的气球
      编号从小到大进行输出。
    */
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #define maxn 101
    int map[maxn][maxn],n,m,color[maxn],vis[maxn],mark[maxn],cb[maxn];
    bool dfs(int k,int v)
    {
    	for(int i = 1; i <= n; i++)
    	{
    		if(map[i][v] != k || vis[i])
    			continue;
    		vis[i] = 1;
    		if(!mark[i] || dfs(k,mark[i]))
    		{
    			mark[i] = v;
    			return true;
    		}
    	}
    	return false;
    }
    int cmp(const void *a ,const void *b)
    {
    	return (int *)a - (int *)b;
    }
    int main()
    {
    	int i,j,ans,num,color_num;
    	while(~scanf("%d%d",&n,&m) && (n||m))
    	{
    		for(i = 1; i <= n; i++)
    		{
    			for(j = 1; j <= n; j++)
    			{
    				scanf("%d",&map[i][j]);
    			}
    		}
    		num = 0;
    		for(i = 1; i <= 50; i++)
    		{
    			ans = 0;
    			memset(mark,0,sizeof(mark));
    			for(j = 1; j <= n; j++)
    			{
    				memset(vis,0,sizeof(vis));
    				if(dfs(i,j))
    					ans++;
    			}
    			if(ans > m)
    				cb[num++] = i;
    		}
    		if(num == 0)
    			printf("-1\n");
    		else
    		{
    			qsort(cb,num,sizeof(int),cmp);
    			for(i = 0; i < num - 1; i++)
    				printf("%d ",cb[i]);
    			printf("%d\n",cb[i]);
    		}
    	}
    	return 0;
    }
  • 相关阅读:
    通过w3c方式 读取xml内容
    ssm项目 maven 项目pon.xml 配置
    myeclipse 2014新建maven web 项目步骤
    Maven学习
    常用正则学习
    Maven 那点事儿
    Chrome 里的请求报错 " Provisional headers are shown"
    php框架thinkphp3.2.3 配置文件bug
    $_GET $_POST $_REQUEST
    php检测函数
  • 原文地址:https://www.cnblogs.com/LUO257316/p/3220831.html
Copyright © 2011-2022 走看看