题意:这里有一个N*M的方格图.....图中m代表人,H代表房子...并且人数和房子的数量是相等的..那么.每个人可以竖直或者横向走一格,并且花费1S元...那么为了让所有的人进入房子,求解最小的花费

分析...:这里很明显 ,就是用人去和房子匹配,并且匹配的权值就是花费.就是求解完备最小权值匹配..那么在输入的时候我们记录每一个人和房子的坐标...那么求解所有的人到所有的房子的距离(即是花费),我们取负值然后用KM算法匹配即可得到答案;;

上马:

  1. // 15MS 272K
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<math.h>
  5.  
  6. #define MAX 101
  7. #define INF 1<<30-1;
  8.  
  9. int N,M;
  10. int man[MAX][2],tol_m;//记录人的坐标和人数
  11. int house[MAX][2],tol_h;//记录房子坐标和房子数
  12. int map[MAX][MAX];//map[i][j]表示第i个人到第j个房子的距离(花费)
  13. int link[MAX],lx[MAX],ly[MAX],slar[MAX];
  14. bool visx[MAX],visy[MAX];
  15.  
  16. bool dfs(int x)
  17. {
  18. visx[x]=true;
  19. for(int y = 0; y < tol_h; y ++)
  20. {
  21. if(visy[y]) continue;
  22. int t = lx[x] + ly[y] -map[x][y];
  23. if(t == 0)
  24. {
  25. visy[y]=true;
  26. if(link[y] == -1 || dfs(link[y]))
  27. {
  28. link[y]=x;return true;
  29. }
  30. }
  31. else
  32. slar[y]=slar[y]>t ? t:slar[y];
  33. }
  34. return false;
  35. }
  36.  
  37. int KM()
  38. {
  39. int i,j;
  40. memset(ly,0,sizeof(ly));
  41. memset(link,-1,sizeof(link));
  42. for( i = 0 ; i < tol_m ; i++)
  43. {
  44. lx[i]=-INF;
  45. for( j = 0 ; j < tol_h ; j++)
  46. lx[i]=lx[i]>map[i][j] ? lx[i]:map[i][j];
  47. }
  48.  
  49. for(int x = 0; x < tol_m ; x ++ )
  50. {
  51. for(i = 0;i <tol_h; i ++ ) slar[i] = INF;
  52. while(1)
  53. {
  54. memset(visx,false,sizeof(visx));
  55. memset(visy,false,sizeof(visy));
  56. if(dfs(x)) break;
  57.  
  58. int d=INF;
  59. for(i = 0 ; i < tol_h; i ++)
  60. if(!visy[i])
  61. d=d>slar[i] ? slar[i]:d;
  62. for(i = 0;i < tol_m; i ++)
  63. if(visx[i]) lx[i] -= d;
  64. for(i = 0; i< tol_h ; i ++)
  65. if(visy[i]) ly[i] += d;
  66. else slar[i] -=d;
  67. }
  68. }
  69. int ans=0;
  70. for(i = 0;i < tol_h;i ++)
  71. if(link[i] != -1) ans+=map[link[i]][i];
  72. return ans;
  73. }
  74.  
  75. int main()
  76. {
  77. int i,j;
  78. char ch[MAX];
  79. while(scanf("%d%d",&N,&M),N+M)
  80. {
  81. tol_m=tol_h=0;
  82. for(i=0;i<N;i++)
  83. {
  84. scanf("%s",ch);
  85. for(j=0;j<M;j++)
  86. {
  87. if(ch[j]=='m')
  88. man[tol_m][0]=i,man[tol_m++][1]=j;
  89. if(ch[j]=='H')
  90. house[tol_h][0]=i,house[tol_h++][1]=j;
  91. }
  92. }
  93. for(i=0;i<tol_m;i++)
  94. for(j=0;j<tol_h;j++)
  95. {
  96. map[i][j]=-(abs(man[i][0]-house[j][0])+abs(man[i][1]-house[j][1]));
  97. }
  98. printf("%d\n",-KM());
  99. }
  100. return 0;
  101. }

个人愚昧观点,欢迎指正和讨论

hdu1533解题报告的更多相关文章

  1. CH Round #56 - 国庆节欢乐赛解题报告

    最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...

  2. 二模13day1解题报告

    二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...

  3. BZOJ 1051 最受欢迎的牛 解题报告

    题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4438  Solved: 2353[S ...

  4. 习题:codevs 2822 爱在心中 解题报告

    这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...

  5. 习题:codevs 1035 火车停留解题报告

    本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...

  6. 习题: codevs 2492 上帝造题的七分钟2 解题报告

    这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...

  7. 习题:codevs 1519 过路费 解题报告

    今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ...

  8. NOIP2016提高组解题报告

    NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合

  9. LeetCode 解题报告索引

    最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中......                        ...

随机推荐

  1. hdu 5104 Primes Problem(prime 将三重循环化两重)

    //宁用大量的二维不用量小的三维 #include <iostream> #include<cstdio> #include<cstring> using name ...

  2. load和ready

    <一>ready和load ready先执行,load后执行 DOM文档加载的步骤: () 解析HTML结构. () 加载外部脚本和样式表文件. () 解析并执行脚本代码. () 构造HT ...

  3. JS数组方法总结

    数组的常用方法总结   不改变原数组 1.Array.length;                       //获取数组长度 2.Array.join();                   ...

  4. [LeetCode]题解(python):071-Simplify Path

    题目来源: https://leetcode.com/problems/simplify-path/ 题意分析: 简化Unix上的绝对路径,也就是多个'/'代表一个,'..'表示返回上一级目录,‘.' ...

  5. Output in PowerShell

    Reference article: https://rkeithhill.wordpress.com/2007/09/16/effective-powershell-item-7-understan ...

  6. verilog中读取文件中的字符串_modelsim高级仿真

    今天给个程序大家玩玩.因为今天遇到一个问题,就是要向UART发送指令,指令非常多,都是字符串.一直copy 函数 UART ("COMM_1");  UART ("COM ...

  7. Error inflating class android.support.v7.widget.Toolbar

    建立程序的时候出现的错误 style.xml中的 <!-- Base application theme. --> <style name="AppTheme" ...

  8. poj 1836 Alignment(线性dp)

    题目链接:http://poj.org/problem?id=1836 思路分析:假设数组为A[0, 1, …, n],求在数组中最少去掉几个数字,构成的新数组B[0, 1, …, m]满足条件B[0 ...

  9. QT在ui文件上建立信号操机制会不会对后期维护产生影响 - love4Mario的专栏 - 博客频道 - CSDN.NETQT在ui文件上建立信号操机制会不会对后期维护产生影响 - love4Mario的专栏 - 博客频道 - CSDN.NET

    QT在ui文件上建立信号操机制会不会对后期维护产生影响 - love4Mario的专栏 - 博客频道 - CSDN.NET QT在ui文件上建立信号操机制会不会对后期维护产生影响 分类: 学习心得 2 ...

  10. C标准函数库中获取时间与日期、对时间与日期数据操作及格式化

    表示时间的三种数据类型[编辑] 日历时间(calendar time),是从一个标准时间点(epoch)到现在的时间经过的秒数,不包括插入闰秒对时间的调整.开始计时的标准时间点,各种编译器一般使用19 ...