HDU 1498 50 years, 50 colors(二分图最小覆盖数)
来源:互联网 发布:淘宝联盟客服热线 编辑:程序博客网 时间:2024/06/05 09:32
HDU 1498 50 years, 50 colors(二分图最小覆盖数)
http://acm.hdu.edu.cn/showproblem.php?pid=1498
题意:
给你一个n*n的矩阵,在矩阵中分布着s种颜色的气球,给你k次扎破气球的操作,每次操作可以扎破一行,或一列的同一颜色的气球。问在k次操作后有那几种颜色的气球是不能被完全扎破的.
分析:
我们需要对于每种颜色判断一下该颜色的气球最少需要多少次才能全部扎破即可.
假设当前处理颜色为1的气球(注意气球颜色最多有50种). 我们把行标号放左点集,列标号放右点集合. 如果(i,j)格子的颜色为1,那么就连一条左i与右j点的边.
由于我们每次可以消灭一行或一列的所有同色气球,那么我们只需要选出尽量少的行号或列号(即左右点集中的点),然后看看这些行号或列号是否正好已经把所有的1颜色气球都覆盖了.
上述问题就是二分图的最小覆盖数问题(想想是不是). 最小覆盖数= 最大匹配数.
AC代码:
#include <cstdio>#include <algorithm>#include <iostream>#include <cstring>#include<stack>#include<vector>using namespace std;const int maxn=200+10;struct Max_Match{int n,m;vector<int>g[maxn];bool vis[maxn];int left[maxn];void init(int n,int m){this->m=m;this->n=n;for(int i=1;i<=n;i++)g[i].clear();memset(left,-1,sizeof left);}bool match(int u){for(int i=0;i<g[u].size();i++){int v=g[u][i];if(!vis[v]){vis[v]=true;if(left[v]==-1||match(left[v])){left[v]=u;return true;}}}return false;}int solve(){int ans=0;for(int i=1;i<=n;i++){memset(vis,false,sizeof vis);if(match(i))ans++;}return ans;}}MM;int maps[maxn][maxn];int num[maxn];int main(){int n,m;while(~scanf("%d%d",&n,&m)){if(n==0&&m==0)break;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){scanf("%d",&maps[i][j]);}int cnt=0;for(int i=1;i<=50;i++){MM.init(n,n);for(int j=1;j<=n;j++)for(int k=1;k<=n;k++){if(maps[j][k]==i){MM.g[j].push_back(k);}}if(MM.solve()>m){num[cnt++]=i;}}if(cnt==0)printf("-1\n");elsefor(int i=0;i<cnt;i++){printf("%d%c",num[i],i!=(cnt-1)?' ':'\n');}}}
阅读全文
0 0
- HDU 1498 50 years, 50 colors(二分图最小覆盖数)
- HDU 1498 50 years, 50 colors(二分图最小覆盖数)
- HDU 1498 50 years, 50 colors(二分图最小覆盖数)
- 【二分图匹配(最小顶点覆盖)】hdu 1498 50 years,50 colors
- hdu 1498 50 years, 50 colors(二分图匹配--最小点覆盖)
- HDU 1498 50 years, 50 colors 二分图最小点覆盖(基础题)
- HDU 1498 50 years, 50 colors 二分图最小点覆盖
- HDU 1498 50 years, 50 colors (二分图最小顶点覆盖)
- HDU 1498 50 years, 50 colors(二分最大匹配之最小点覆盖)
- HDU-1498-50 years,50 colors【二分匹配】【最小顶点覆盖】
- HDOJ 1498 - 50 years, 50 colors 水二分图..二分图最小点覆盖
- hdu 1498 50 years, 50 colors(最小顶点覆盖)
- HDU 1498 50 years, 50 colors 最小点覆盖
- hdu 1498 50 years, 50 colors(最小顶点覆盖)
- HDU-1498 50 years, 50 colors 最小点覆盖
- HDU 1498 50 years, 50 colors(最小点覆盖,坑题)
- HDU 1498 50 years, 50 colors 最小点覆盖
- hdu 1498 50 years, 50 colors(最小覆盖点数)
- 状压dp练习
- maven启动报错
- C# 数组、ArrayList和List<T>的区别
- AngularJS学习1
- Android 自定义Wifi信号指示View
- HDU 1498 50 years, 50 colors(二分图最小覆盖数)
- Java设计模式之装饰模式
- pydata p26 图片显示不出来
- Java之HashMap与HashTable
- 第三章:3.3 傅里叶级数收敛分析
- 密码学MD5|DES|RSA加密解密(内有源码)
- 查询表达式转变为elasticsearch查询语句
- vtk基础02观察者/命令机制
- Maven-maven多模块项目搭建+Dubbo分布式服务框架 budong