二分匹配之最大权值匹配算法---KM模板
大神总结:http://www.cnblogs.com/skyming/archive/2012/02/18/2356919.html
代码:
- #include<stdio.h>
- #include<string.h>
- const int N=,INF=0x3f3f3f3f;
- int lx[N],ly[N],vx[N],vy[N],slack[N],match[N];
- int a[N][N];
- int nx,ny;
- int dfs(int u)
- {
- vx[u]=;
- for(int i=;i<=ny;i++)
- {
- if(vy[i]) continue;
- int t=lx[u]+ly[i]-a[u][i];
- if(t==)
- {
- vy[i]=;
- if(match[i]==-||dfs(match[i]))
- {
- match[i]=u;
- return ;
- }
- }
- else if(slack[i]>t)
- slack[i]=t;
- }
- return ;
- }
- int KM()
- {
- int i,j,d;
- memset(ly,,sizeof(ly));
- memset(match,-,sizeof(match));
- for(i=,lx[i]=-INF;i<=nx;i++)
- for(j=;j<=ny;j++)
- if(a[i][j]>lx[i])
- lx[i]=a[i][j];
- for(i=;i<=nx;i++)
- {
- memset(slack,0x3f,sizeof(slack));
- while()
- {
- memset(vx,,sizeof(vx));
- memset(vy,,sizeof(vy));
- if(dfs(i)) break;
- d=INF;
- for(j=;j<=ny;j++)
- if(!vy[j]&&slack[j]<d)
- d=slack[j];
- //if(d==INF) break;//该点找不到任何匹配
- for(j=;j<=nx;j++)
- if(vx[j])
- lx[j]-=d;
- for(j=;j<=ny;j++)
- {
- if(vy[j])
- ly[j]+=d;
- else
- slack[j]-=d;
- }
- }
- }
- int ans=,sum=;
- for(i=;i<=ny;i++)
- if(match[i]>-&&a[match[i]][i])
- ans+=a[match[i]][i],sum++;
- printf("%d++\n",sum);//匹配数
- return ans;
- }
- int main()
- {
- int m,u,v,w,n,i;
- scanf("%d",&nx);
- scanf("%d",&ny);
- scanf("%d",&m);
- memset(a,,sizeof(a));
- while(m--)
- {
- scanf("%d%d%d",&u,&v,&w);
- a[u][v]=a[v][u]=w;
- }
- printf("%d\n",KM());
- return ;
- }
二分匹配之最大权值匹配算法---KM模板的更多相关文章
- HDU2255-奔小康赚大钱-二分图最大权值匹配-KM算法
二分图最大权值匹配问题.用KM算法. 最小权值的时候把权值设置成相反数 /*-------------------------------------------------------------- ...
- POJ 2400 Supervisor, Supervisee(KM二分图最大权值匹配)题解
题意:n个老板n个员工,先给你n*n的数据,i行j列代表第i个老板第j喜欢的员工是谁,再给你n*n的数据,i行j列代表第i个员工第j喜欢的老板是谁,如果匹配到第k喜欢的人就会产生一个分数k-1.现在让 ...
- 奔小康赚大钱 HDU - 2255(最大权值匹配 KM板题)
奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- hdu 1853 Cyclic Tour (二分匹配KM最小权值 或 最小费用最大流)
Cyclic Tour Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/65535 K (Java/Others)Total ...
- kuangbin带你飞 匹配问题 二分匹配 + 二分图多重匹配 + 二分图最大权匹配 + 一般图匹配带花树
二分匹配:二分图的一些性质 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j ...
- 【HDU 2255】奔小康赚大钱 (最佳二分匹配KM算法)
奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- Tour HDU - 3488(最大权值匹配)
Tour In the kingdom of Henryy, there are N (2 <= N <= 200) cities, with M (M <= 30000) one- ...
- hdu 1853 Cyclic Tour 最大权值匹配 全部点连成环的最小边权和
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1853 Cyclic Tour Time Limit: 1000/1000 MS (Java/Others) ...
- poj3565 Ants km算法求最小权完美匹配,浮点权值
/** 题目:poj3565 Ants km算法求最小权完美匹配,浮点权值. 链接:http://poj.org/problem?id=3565 题意:给定n个白点的二维坐标,n个黑点的二维坐标. 求 ...
随机推荐
- memcache与memcached扩展的区别
一.服务端 之前理解错误了.服务端只有一个memcache,一般把服务端称作memcached(带d),是因为守护进程的名称就是叫做memcached(一个这样的执行程序文件). 编写的语言:c语言 ...
- 【使用 DOM】使用事件
1. 使用简单事件处理器 可以用几种不同的方式处理事件.最直接的方式是用事件属性创建一个简单事件处理器(simple event handler).元素为它们支持的每一种事件都定义了一个事件属性.举个 ...
- iOS设计模式之单例模式
单例模式 基础理解 所有类都有构造方法,不编码则系统默认生成空的构造方法,若有显示定义的构造方法,默认的构造方法就会失效. 单例模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全 ...
- Objective-C之优雅的命名
There are only two hard things in Computer Science: cache invalidation and naming things.在计算机科学中只有两件 ...
- App Icon生成工具(转载)
原地址:http://www.cocoachina.com/bbs/read.php?tid=290247 下载软件:在AppStore搜索App Icon Gear 打开软件 决定制作启动图或图标, ...
- Mac上的软件使用介绍
目录大纲: Drop to GIF Parallels Desktop 1.Drop to GIF 功能:将视频文件可以生产动态图gif文件 网址在github上:https://github.com ...
- UVa 100 - The 3n + 1 problem(函数循环长度)
题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...
- 快捷下载 sourceForge下的资源
一些开源项目通常会放在 sourceforge.net下面发布.然而,这个网站有时候出现卡顿,并且需要点击几次页面才能下载到自己想要的资源. 这里有个好办法,一步列出所有可下载的资源: ...
- android多种布局的列表实现
最近有一个列表效果,需要一个列表有多种布局,最终效果如下: 这个我也问了同事以及开发群里的朋友,居然都没得到最优的实现方式的回答,看来这种复杂列表的需求还是比较少的,我自己也走了一些弯路,把我几个实现 ...
- Asp.net MVC 4新项目中创建area的后续操作
Asp.net MVC 4新项目中创建area后,往往HomeController与area的HomeController路由发生混淆,需要手工设置一些地方避免mvc无法识别默认路由的状况. 无废话具 ...