hdu1533解题报告
题意:这里有一个N*M的方格图.....图中m代表人,H代表房子...并且人数和房子的数量是相等的..那么.每个人可以竖直或者横向走一格,并且花费1S元...那么为了让所有的人进入房子,求解最小的花费
分析...:这里很明显 ,就是用人去和房子匹配,并且匹配的权值就是花费.就是求解完备最小权值匹配..那么在输入的时候我们记录每一个人和房子的坐标...那么求解所有的人到所有的房子的距离(即是花费),我们取负值然后用KM算法匹配即可得到答案;;
上马:
- // 15MS 272K
- #include<stdio.h>
- #include<string.h>
- #include<math.h>
- #define MAX 101
- #define INF 1<<30-1;
- int N,M;
- int man[MAX][2],tol_m;//记录人的坐标和人数
- int house[MAX][2],tol_h;//记录房子坐标和房子数
- int map[MAX][MAX];//map[i][j]表示第i个人到第j个房子的距离(花费)
- int link[MAX],lx[MAX],ly[MAX],slar[MAX];
- bool visx[MAX],visy[MAX];
- bool dfs(int x)
- {
- visx[x]=true;
- for(int y = 0; y < tol_h; y ++)
- {
- if(visy[y]) continue;
- int t = lx[x] + ly[y] -map[x][y];
- if(t == 0)
- {
- visy[y]=true;
- if(link[y] == -1 || dfs(link[y]))
- {
- link[y]=x;return true;
- }
- }
- else
- slar[y]=slar[y]>t ? t:slar[y];
- }
- return false;
- }
- int KM()
- {
- int i,j;
- memset(ly,0,sizeof(ly));
- memset(link,-1,sizeof(link));
- for( i = 0 ; i < tol_m ; i++)
- {
- lx[i]=-INF;
- for( j = 0 ; j < tol_h ; j++)
- lx[i]=lx[i]>map[i][j] ? lx[i]:map[i][j];
- }
- for(int x = 0; x < tol_m ; x ++ )
- {
- for(i = 0;i <tol_h; i ++ ) slar[i] = INF;
- while(1)
- {
- memset(visx,false,sizeof(visx));
- memset(visy,false,sizeof(visy));
- if(dfs(x)) break;
- int d=INF;
- for(i = 0 ; i < tol_h; i ++)
- if(!visy[i])
- d=d>slar[i] ? slar[i]:d;
- for(i = 0;i < tol_m; i ++)
- if(visx[i]) lx[i] -= d;
- for(i = 0; i< tol_h ; i ++)
- if(visy[i]) ly[i] += d;
- else slar[i] -=d;
- }
- }
- int ans=0;
- for(i = 0;i < tol_h;i ++)
- if(link[i] != -1) ans+=map[link[i]][i];
- return ans;
- }
- int main()
- {
- int i,j;
- char ch[MAX];
- while(scanf("%d%d",&N,&M),N+M)
- {
- tol_m=tol_h=0;
- for(i=0;i<N;i++)
- {
- scanf("%s",ch);
- for(j=0;j<M;j++)
- {
- if(ch[j]=='m')
- man[tol_m][0]=i,man[tol_m++][1]=j;
- if(ch[j]=='H')
- house[tol_h][0]=i,house[tol_h++][1]=j;
- }
- }
- for(i=0;i<tol_m;i++)
- for(j=0;j<tol_h;j++)
- {
- map[i][j]=-(abs(man[i][0]-house[j][0])+abs(man[i][1]-house[j][1]));
- }
- printf("%d\n",-KM());
- }
- return 0;
- }
个人愚昧观点,欢迎指正和讨论
hdu1533解题报告的更多相关文章
- CH Round #56 - 国庆节欢乐赛解题报告
最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...
- 二模13day1解题报告
二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...
- BZOJ 1051 最受欢迎的牛 解题报告
题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4438 Solved: 2353[S ...
- 习题:codevs 2822 爱在心中 解题报告
这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...
- 习题:codevs 1035 火车停留解题报告
本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...
- 习题: codevs 2492 上帝造题的七分钟2 解题报告
这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...
- 习题:codevs 1519 过路费 解题报告
今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ...
- NOIP2016提高组解题报告
NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合
- LeetCode 解题报告索引
最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中...... ...
随机推荐
- hdu 5104 Primes Problem(prime 将三重循环化两重)
//宁用大量的二维不用量小的三维 #include <iostream> #include<cstdio> #include<cstring> using name ...
- load和ready
<一>ready和load ready先执行,load后执行 DOM文档加载的步骤: () 解析HTML结构. () 加载外部脚本和样式表文件. () 解析并执行脚本代码. () 构造HT ...
- JS数组方法总结
数组的常用方法总结 不改变原数组 1.Array.length; //获取数组长度 2.Array.join(); ...
- [LeetCode]题解(python):071-Simplify Path
题目来源: https://leetcode.com/problems/simplify-path/ 题意分析: 简化Unix上的绝对路径,也就是多个'/'代表一个,'..'表示返回上一级目录,‘.' ...
- Output in PowerShell
Reference article: https://rkeithhill.wordpress.com/2007/09/16/effective-powershell-item-7-understan ...
- verilog中读取文件中的字符串_modelsim高级仿真
今天给个程序大家玩玩.因为今天遇到一个问题,就是要向UART发送指令,指令非常多,都是字符串.一直copy 函数 UART ("COMM_1"); UART ("COM ...
- Error inflating class android.support.v7.widget.Toolbar
建立程序的时候出现的错误 style.xml中的 <!-- Base application theme. --> <style name="AppTheme" ...
- poj 1836 Alignment(线性dp)
题目链接:http://poj.org/problem?id=1836 思路分析:假设数组为A[0, 1, …, n],求在数组中最少去掉几个数字,构成的新数组B[0, 1, …, m]满足条件B[0 ...
- QT在ui文件上建立信号操机制会不会对后期维护产生影响 - love4Mario的专栏 - 博客频道 - CSDN.NETQT在ui文件上建立信号操机制会不会对后期维护产生影响 - love4Mario的专栏 - 博客频道 - CSDN.NET
QT在ui文件上建立信号操机制会不会对后期维护产生影响 - love4Mario的专栏 - 博客频道 - CSDN.NET QT在ui文件上建立信号操机制会不会对后期维护产生影响 分类: 学习心得 2 ...
- C标准函数库中获取时间与日期、对时间与日期数据操作及格式化
表示时间的三种数据类型[编辑] 日历时间(calendar time),是从一个标准时间点(epoch)到现在的时间经过的秒数,不包括插入闰秒对时间的调整.开始计时的标准时间点,各种编译器一般使用19 ...