二分图最大权值匹配问题。用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. Code Conventions for the Java

    Oracel官方JAVA编码规范指引 http://www.oracle.com/technetwork/java/codeconvtoc-136057.html

  2. 数论 - Moon Game

    Fat brother and Maze are playing a kind of special (hentai) game in the clearly blue sky which we ca ...

  3. php这是一个随机打印输出字符串的例子

    <?php header("Content-type:text/html;charset='utf8'"); error_reporting(E_ALL); define(& ...

  4. Jesen不等式

  5. 使用Volley执行网络数据传输

    首先需要实例化一个RequestQueue RequestQueue queue = Volley.newRequestQueue(this); 然后是根据提供的URL请求字符串响应 String u ...

  6. 【整理】C#文件操作大全(SamWang)&lt;转&gt;

    文件与文件夹操作主要用到以下几个类: 1.File类: 提供用于创建.复制.删除.移动和打开文件的静态方法,并协助创建 FileStream 对象. msdn:http://msdn.microsof ...

  7. 【AngularJS】—— 7 模块化

    AngularJS有几大特性,比如: 1 MVC 2 模块化 3 指令系统 4 双向数据绑定 那么本篇就来看看AngularJS的模块化. 首先先说一下为什么要实现模块化: 1 增加了模块的可重用性 ...

  8. json_decode()和json_encode()的使用方法

    json_decode对JSON格式的字符串进行编码 json_encode对变量进行 JSON 编码 JS中对JSON的解析 一.JSON字符串转换为JSON对象     要运用上面的str1,必须 ...

  9. hdu 3183(贪心)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3183 思路:比较前后两个相邻的字符,如果前面一个字符大于后面一个字符,就把它去掉. #include ...

  10. C#与数据库访问技术总结(五)之Command对象的常用方法

    Command对象的常用方法 说明:上篇总结了Command对象的几个数据成员,这节总结Command对象的常用方法. 同样,在不同的数据提供者的内部,Command对象的名称是不同的,在SQL Se ...