二分图最大权值匹配问题。用KM算法。

最小权值的时候把权值设置成相反数

 /*--------------------------------------------------------------------------------------*/

 #include <algorithm>
 #include <iostream>
 #include <cstring>
 #include <ctype.h>
 #include <cstdlib>
 #include <cstdio>
 #include <vector>
 #include <string>
 #include <queue>
 #include <stack>
 #include <cmath>
 #include <set>
 #include <map>

 //debug function for a N*M array
 #define debug_map(N,M,G) printf("\n");for(int i=0;i<(N);i++)\
 {;j<(M);j++){\
 printf("%d",G[i][j]);}printf("\n");}
 //debug function for int,float,double,etc.
 #define debug_var(X) cout<<#X"="<<X<<endl;
 #define LL long long
 const int INF = 0x3f3f3f3f;
 const LL LLINF = 0x3f3f3f3f3f3f3f3f;
 /*--------------------------------------------------------------------------------------*/
 using namespace std;

 int N,M,T;
 ;
 int nx,ny;
 int g[maxn][maxn];
 int linker[maxn],lx[maxn],ly[maxn];
 int slack[maxn];
 bool visx[maxn],visy[maxn];
 bool DFS(int x)
 {
     visx[x] = true;
     ;y<ny;y++)
     {
         if(visy[y]) continue;
         int tmp = lx[x] + ly[y] - g[x][y];
         )
         {
             visy[y] = true;
              || DFS(linker[y]))
             {
                 linker[y] = x;
                 return true;
             }
         }
         else if(slack[y] > tmp) slack[y] = tmp;
     }
     return false;
 }
 int KM()
 {
     memset(linker,-,sizeof linker);
     memset(ly,,sizeof ly);
     ;i<nx;i++)
     {
         lx[i] = -INF;
         ;j<ny;j++)   lx[i] = max(lx[i],g[i][j]);
     }
     ;x<nx;x++)
     {
         ;i<ny;i++) slack[i] = INF;
         while(true)
         {
             memset(visx,false,sizeof visx);
             memset(visy,false,sizeof visy);
             if(DFS(x)) break;
             int d = INF;
             ;i<ny;i++) if(!visy[i] && d > slack[i]) d = slack[i];
             ;i<nx;i++) if(visx[i]) lx[i] -= d;
             ;i<ny;i++)
             {
                 if(visy[i]) ly[i] += d;
                 else slack[i] -= d;
             }
         }
     }
     ;
     ;i<ny;i++) ) res += g[linker[i]][i];
     return res;
 }
 int main()
 {
     while(~scanf("%d",&N))
     {
         ;i<N;i++)
         {
             ;j<N;j++)
             {
                 scanf("%d",&g[i][j]);
             }
         }
         nx = ny = N;
         printf("%d\n",KM());
     }
 }

HDU2255-奔小康赚大钱-二分图最大权值匹配-KM算法的更多相关文章

  1. HD2255奔小康赚大钱(最大权匹配模板)

    奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  2. 【模板】二分图最大权完美匹配KM算法

    hdu2255模板题 KM是什么意思,详见百度百科. 总之知道它可以求二分图最大权完美匹配就可以了,时间复杂度为O(n^3). 给张图. 二分图有了边权,求最大匹配下的最大权值. 所以该怎么做呢?对啊 ...

  3. HDU2255 奔小康赚大钱【二分图最佳匹配】

    题目链接: http://acm.hdu.edu.cn/showproblem.php? pid=2255 题目大意: 村里要分房子. 有N家老百姓,刚好有N间房子.考虑到每家都要有房住,每家必须分配 ...

  4. HDU - 2255 奔小康赚大钱(最大带权匹配)

     Problem Description 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子.这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好有n家老百姓, ...

  5. HDU 2255 奔小康赚大钱(带权二分图最大匹配)

    HDU 2255 奔小康赚大钱(带权二分图最大匹配) Description 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子. 这可是一件大事,关系到人民的住房问题啊 ...

  6. 【HDU 2255】奔小康赚大钱 (最佳二分匹配KM算法)

    奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  7. 奔小康赚大钱(km)

    奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  8. 奔小康赚大钱 hdu 2255

    奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  9. hdu_2255_奔小康赚大钱(KM带权二分匹配板子)

    题目连接:hdu_2255_奔小康赚大钱 存个板子 /* 其实在求最大 最小的时候只要用一个模板就行了, 把边的权值去相反数即可得到另外一个.求结果的时候再去 相反数即可,最大最小有一些地方不同.. ...

随机推荐

  1. asp.net core 如何在Controller获取配置文件的值

    场景:我们会把一些配置信息,写在配置文件文件中,便于我们修改和配置.在之前的asp.net 中可以通过ConfigurationManger来获取web.config里面的配置.在.net core ...

  2. Ms - Sql 定位附近的人

    数据库结构: T_Users longitude decimal(6,0) latitude decimal(6,0) 经纬度:113.284137,23.184625 查出周围2公里以内的人: se ...

  3. 巧用array_map()和array_reduce()替代foreach循环

    1.array_reduce( $arr , callable $callback ) 使用回调函数迭代地将数组简化为单一的值. 其中$arr 为输入数组,$callback($result , $v ...

  4. 友盟页面统计 - 关于Viewpager中的Fragment的生命周期

    Activity和Fragment各自理论上的生命周期 Activity的生命周期是较为经典也最清晰的,在此不表: Fragment从出现到广泛运用也有一段时间了,其标准生命周期也仅比Activity ...

  5. Linux_Shell

    一.Shell 种类与归属 Unix与Linux常见的Shell脚本解释器有bash,sh,csh,ksh等(PS: bash 完全兼容sh) bash : linux 默认的shell sh : u ...

  6. C#的泛型委托与闭包函数

    前些天Wendy问我说Func<T, ResultT>是个什么意思,初学C#都觉得这样的写法很奇葩,甚至觉得这样写有点诡异,其实以我来看,这是体现C#函数式编程的又一个亮点. 从MSDN上 ...

  7. 异步调用webservice

    一.异步调用 asynchronous call(异步调用):一个可以无需等待被调用函数的返回值就让操作继续进行的方法 举例: 异步调用就是你 喊 你朋友吃饭 ,你朋友说知道了 ,待会忙完去找你 ,你 ...

  8. 从BlackHat2013中我们收获了什么

    拉斯维加斯-BlackHat全球黑客大会是每年围观革新安全技术的最好机会,还能和那些 在这个行业里聪明至极的家伙交谈并从中得到些关于前沿技术的动向和启示.今年的会议无论参会人数还是议题数量是历届规模最 ...

  9. ASP.NET读取配置文件发送邮件

    之前写过一篇文章C#使用SMTP发送邮件 后来做了改进,改成读取独立的配置文件,本文只记录读取配置文件的部分,发送部分见上面的链接. 读取配置文件C#代码: using System; using S ...

  10. #pragma warning 启用和禁用warning

    开发人员可以使用 #pragma 指令将警告作为错误处理:还可以启用或禁用警告,如下面的示例所示: 1.将一个warning作为一个错误 #pragma warning (error: 6260) 2 ...