hrbust 1407 Leyni的游戏【KM】
来源:互联网 发布:好听的网络dj歌曲大全 编辑:程序博客网 时间:2024/06/08 20:18
Leyni的游戏Time Limit: 1000 MSMemory Limit: 65536 KTotal Submit: 130(26 users)Total Accepted: 43(25 users)Rating: Special Judge: NoDescription
Leyni正在玩一款游戏,规则如下:
有一个n * m的矩阵,每个元素都是非负的,每一行,每一列的边缘都有一个按钮(即n + m个),对应着第1行,第2行,第3行,…,第n行,第1列,第2列,第3列,…,第m列。每当他按下某个按钮,那么对应的一行或者一列的所有元素将减去1,值为0的元素不受到影响。
他想知道,他最少需要按多少次按钮,能够将整个矩阵都变成0。Input输入包含多组测试数据。
对于每组测试数据:
第1行,包含二个整数n, m (1 ≤ n, m ≤ 200)代表着矩阵的大小。
接下来将输入一个n * m的矩阵,每个元素的范围为[0, 10000]。
处理到文件结束。
对于每组测试数据:
第1行,输出Leyni至少要按多少次按钮。
2 2
1 2
1 1
3
SourceHarbin University of Science and Technology Collegiate Programming Contest Spring 2012 - PracticeAuthor齐达拉图@HRBUST
思路:
1、如果问题简化(只有0和1两个元素):
那么问题就变成了行列匹配的最小点覆盖问题,那么加上了权值,其实也是一个道理,我们只是从匈牙利求最大匹配,变成了km求最大权值匹配。
2、因为n,m大小不定,如果固定n,m匹配,不一定谁大谁小,会引起TLE的情况发生。那么我们可以将n*m的矩阵,看成一个max(n,m)*max(n,m)的矩阵即可。
3、输入进去图之后,直接跑KM匹配即可。
Ac代码:
#include<stdio.h>#include<string.h>#include<iostream>using namespace std;int a[350][350];int lx[350];int ly[350];int vx[350];int vy[350];int match[350];int n,m,low;int find(int u){ vx[u]=1; for(int i=1;i<=n;i++) { if(vy[i])continue; int tmp=lx[u]+ly[i]-a[u][i]; if(tmp==0) { vy[i]=1; if(match[i]==-1||find(match[i])) { match[i]=u; return 1; } } else if(tmp<low)low=tmp; } return 0;}void KM(){ memset(match,-1,sizeof(match)); memset(lx,0,sizeof(lx)); memset(ly,0,sizeof(ly)); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { lx[i]=max(lx[i],a[i][j]); } } for(int i=1;i<=n;i++) { while(1) { memset(vx,0,sizeof(vx)); memset(vy,0,sizeof(vy)); low=0x3f3f3f3f; if(find(i))break; for(int j=1;j<=n;j++) { if(vx[j])lx[j]-=low; } for(int j=1;j<=n;j++) { if(vy[j])ly[j]+=low; } } } int sum=0; for(int i=1;i<=n;i++) { //printf("%d\n",match[i]); if(match[i]==-1)continue; sum+=a[match[i]][i]; } printf("%d\n",sum);}int main(){ int nn,mm; while(~scanf("%d%d",&nn,&mm)) { memset(a,0,sizeof(a)); for(int i=1;i<=nn;i++) { for(int j=1;j<=mm;j++) { scanf("%d",&a[i][j]); } } n=max(nn,mm); KM(); }}
0 0
- hrbust 1407 Leyni的游戏【KM】
- hrbust 1325 Leyni的车牌号【贪心】
- hrbust 1359 Leyni的国家II【树状dp】
- Hrbust 1361 Leyni的机器人【dp】好题
- hrbust 哈理工oj 1360 Leyni的国家III【多路径并查集】
- hrbust 1326 哈理工oj 1326 Leyni的国家【DFS+邻接表建图】
- hrbust 1404 Leyni的汽车比赛【dp+思维优化】好题!
- Hrbust 1427 Leyni的情人节【思维+最长递减子序列】好题!
- hrbust 1356Leyni,罗莉和队列
- hrbust 1397 XianGe的游戏II【KMP】
- hrbust 1691 无聊的游戏【贪心】
- hrbust 1375 The Active Leyni【暴力打表+递推+矩阵快速幂】
- hrbust 1355 Leyni,罗莉和XianGe【最短路SPFA+思维】好题
- Hrbust 1355 Leyni,罗莉和XianGe (最短路 思维建图,dij优化)
- hrbust 1356 Leyni,罗莉和队列【思维+逆向思维】好题~
- Hrbust 1410 Leyni VS XianGe II【思维】好题!趣味题!
- Hrbust 1329 Leyni, 罗莉 与 游乐场【树型Dp+思维】好题!
- Hrbust 1390 Leyni, LOLI and Numbers【思维+树状数组+二分+双向链表模拟】好题!好题!好题!
- .NET CORE 实践(2)--对Ubuntu下安装SDK的记录
- Java环境设置、HelloWorld例子、Ant环境及运行
- DP方程——Coloring Trees ( Codeforces Round #369 (Div. 2) C )
- 二维子数组最大值
- poj 1027 The Same Game 模拟
- hrbust 1407 Leyni的游戏【KM】
- web项目中的requestUri servletPath
- windows for/F 详解
- Linux设备模型-2-_Kobject
- Obj-C与javascript交互之WebViewJavascriptBridge
- Oracle:PL/SQL--PL/SQL声明及变量命名规则
- 阿里云服务器微信接口开发TOKEN验证失败
- Effective java 中的 继承和复合
- C#学习记录:委托