POJ 1498[二分匹配——最小顶点覆盖]
题目链接:【http://acm.hdu.edu.cn/showproblem.php?pid=1498】
题意:给出一个大小为n*n(0<n<100)的矩阵,矩阵中放入m种颜色(标号为1-m),然后对于每种颜色有k次操作,每次操作可以选择一行或者一列,然后把这一行或者这一列的这种颜色全部去掉,求每种颜色k次操作以后,不能去掉的颜色是哪几种颜色,从小到大输出。
最小顶点覆盖要求用最少的点(X或Y中都行),让每条边都至少和其中一个点关联。Knoig定理:二分图的最小顶点覆盖数等于二分图的最大匹配数。
横坐标映射成X点集合,纵坐标映射成Y点,把每个矩阵中相同颜色点的坐标(x,y)建立一条边x->y,目的是选择最少的点把所有的边(即:矩阵中的点)覆盖。
#include<bits/stdc++.h>
using namespace std;
const int maxn = ;
int n, k;
struct node
{
int u, v;
};
vector<node>E[];
vector<int>Edge[maxn], ans;
void init()
{
for(int i = ; i <= ; i++)
E[i].clear();
ans.clear();
}
int fa[maxn], vis[maxn];
bool match(int u)
{
int l = Edge[u].size();
for(int i = ; i < l; i++)
{
int v = Edge[u][i];
if(vis[v]) continue;
vis[v] = ;
if(fa[v] == - || match(fa[v]))
{
fa[v] = u;
return true;
}
}
return false;
}
int hungry()
{
int ret = ;
memset(fa, -, sizeof(fa));
for(int i = ; i <= n; i++)
{
memset(vis, , sizeof(vis));
if(match(i)) ret++;
}
return ret;
}
int main ()
{
while(scanf("%d%d", &n, &k))
{
if(n == && k == ) break;
init();
int t, ma = ;
for(int i = ; i <= n; i++)
for(int j = ; j <= n; j++)
{
scanf("%d", &t);
E[t].push_back(node{i, j});
ma = max(ma, t);
}
for(int i = ; i <= ma; i++)
{
for(int j = ; j <= n; j++)
Edge[j].clear();
int l = E[i].size();
for(int j = ; j < l; j++)
Edge[E[i][j].u].push_back(E[i][j].v);
if(hungry() > k) ans.push_back(i);
}
int l = ans.size();
if(!l) printf("-1\n");
else
{
for(int i = ; i < l - ; i++)
printf("%d ", ans[i]);
printf("%d\n", ans[l - ]);
}
}
return ;
}
POJ 1498[二分匹配——最小顶点覆盖]的更多相关文章
- poj2226-Muddy Fields二分匹配 最小顶点覆盖 好题
题目 给到一个矩阵,有些格子上是草,有些是水.需要用宽度为1,长度任意的若干块木板覆盖所有的水,并不能覆盖草,木板可以交叉,但只能横竖放置,问最少要多少块板. 分析 经典的矩阵二分图构图和最小点覆盖. ...
- POJ2226 Muddy Fields 二分匹配 最小顶点覆盖 好题
在一个n*m的草地上,.代表草地,*代表水,现在要用宽度为1,长度不限的木板盖住水, 木板可以重叠,但是所有的草地都不能被木板覆盖. 问至少需要的木板数. 这类题的建图方法: 把矩阵作为一个二分图,以 ...
- nyoj 237 游戏高手的烦恼 二分匹配--最小点覆盖
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=237 二分匹配--最小点覆盖模板题 Tips:用邻接矩阵超时,用数组模拟邻接表WA,暂时只 ...
- POJ 3020 Antenna Placement【二分匹配——最小路径覆盖】
链接: http://poj.org/problem?id=3020 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22010#probl ...
- UVA 11419 SAM I AM(最大二分匹配&最小点覆盖:König定理)
题意:在方格图上打小怪,每次可以清除一整行或一整列的小怪,问最少的步数是多少,又应该在哪些位置操作(对输出顺序没有要求). 分析:最小覆盖问题 这是一种在方格图上建立的模型:令S集表示“行”,T集表示 ...
- poj 2446 (二分匹配)
题意:除了所给的一些点外,问能不能用1*2的矩形覆盖所有的点,矩形间不能重叠. 思路:简单二分匹配,,,,,,, #include<stdio.h> #include<string. ...
- HDU - 1150 Machine Schedule(二分匹配---最小点覆盖)
题意:有两台机器A和B,A有n种工作模式(0~n-1),B有m种工作模式(0~m-1),两台机器的初始状态都是在工作模式0处.现在有k(0~k-1)个工作,(i,x,y)表示编号为i的工作可以通过机器 ...
- HDU 1498 50 years, 50 colors (行列匹配+最小顶点覆盖)
题目:点击打开链接 题意:每个格子有不同颜色的气球用不同数字表示,每次可选某一行 或某一列来戳气球.每个人有K次机会.求最后哪些气球不能在 k次机会内 ...
- POJ - 2226 Muddy Fields (最小顶点覆盖)
*.*. .*** ***. ..*. 题意:有一个N*M的像素图,现在问最少能用几块1*k的木条覆盖所有的 * 点,k为>=1的任意值. 分析:和小行星那题很像.小行星那题是将一整行(列)看作 ...
随机推荐
- 【Hadoop】大数据时代,我们为什么使用hadoop
博客已转移,请借一步说话.http://www.daniubiji.cn/archives/538 我们先来看看大数据时代, 什么叫大数据,“大”,说的并不仅是数据的“多”!不能用数据到了多少TB , ...
- 【BZOJ】2331: [SCOI2011]地板 插头DP
[题意]给定n*m的地板,有一些障碍格,要求用L型的方块不重不漏填满的方案数.L型方块是从一个方格向任意两个相邻方向延伸的方块,不能不延伸.n*m<=100. [算法]插头DP [题解]状态0表 ...
- 【CodeForces】899 F. Letters Removing
[题目]F. Letters Removing [题意]给定只含小写字母.大写字母和数字的字符串,每次给定一个范围要求删除[l,r]内的字符c(l和r具体位置随删除变动),求m次操作后的字符串.n&l ...
- MySQL join 用法
select column1, column2 from TABLE1 join TABLE2 on 条件 # select * from table1 join table2; #两个表合成一个se ...
- linux动态库编译和使用详细剖析 - 后续
引言 - 也许是修行 很久以前写过关于动态库科普文章, 废话反正是说了好多. 核心就是在 linux 上面玩了一下 dlopen : ) linux动态库编译和使用详细剖析 - https://www ...
- [会装]Hive安装(基于mysql数据库)
环境信息:Mac 安装步骤: 1. 下载hive组件(我选择的是社区的2.0.1版本) http://apache.mirror.globo.tech/hive/hive-2.0.1/ 2. 下载my ...
- fullpage.js 具体使用方法
1.fullpage.js 下载地址 https://github.com/alvarotrigo/fullPage.js 2.fullPage.js 是一个基于 jQuery 的插件,它能够很方便 ...
- 用dom4j操作xml文件
XML的全称是eXtensible Markup Language,即“可扩展标记语言”.XML文件的作用主要是数据存储,文件配置,数据传输. html与xml的区别是:①html语法松散,xml语法 ...
- Integer类实现方式和注意事项
java.lang.Integer类的源代码: //定义一个长度为256的Integer数组 static final Integer[] cache = new Integer[-(-128) + ...
- tp总结
不知不觉学tp也快一个月了,虽然还处于一个仅仅只会使用的阶段,但毕竟算是我详细接触的第一个脚本框架,tp还是让我收获了许多. 废话不多说,先列出几个对于我这种新手来说tp新奇而实用的地方. 1.连贯操 ...