hdu3488Tour KM算法
- //给一个有向图,
- //找出若干环,使得这些环覆盖全部点且每一个点仅仅能在一个环中
- //问所得的全部环的全部边权值之和的最小值为多少
- //对于每一个点仅仅有一个入度和一个出度。那么将每一个点拆成
- //入度点和出度点,将全部入度点和全部出度点构成一个完备匹配
- //因为是完备匹配,所以每一个点的出度和入度都有一个不是自己的点
- //相连,那么将完备匹配的全部点连接起来一定是若干环
- //所得完备匹配的最小匹配即为答案
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- using namespace std ;
- const int maxn = 210 ;
- const int inf = 0x3f3f3f3f ;
- int lx[maxn] , ly[maxn] , slack[maxn] ;
- int visx[maxn] , visy[maxn] , match[maxn] ;
- int map[maxn][maxn] ;
- int n , m ;
- int find(int x)
- {
- visx[x] = 1 ;
- for(int i = 1;i <= n;i++)
- {
- if(visy[i])continue ;
- int tmp = lx[x] + ly[i] - map[x][i] ;
- if(tmp == 0)
- {
- visy[i] = 1 ;
- if(match[i] == -1 || find(match[i]))
- {
- match[i] = x ;
- return true ;
- }
- }
- else slack[i] = min(slack[i] , tmp) ;
- }
- return false ;
- }
- int KM()
- {
- memset(ly , 0 , sizeof(ly)) ;
- memset(match , -1 , sizeof(match)) ;
- for(int i = 1;i <= n;i++)
- {
- lx[i] = -inf ;
- for(int j = 1;j <= n;j++)
- lx[i] = max(lx[i] , map[i][j]) ;
- }
- for(int i = 1;i <= n;i++)
- {
- for(int j = 1;j <= n;j++)
- slack[j] = inf ;
- while(1)
- {
- memset(visx , 0 ,sizeof(visx)) ;
- memset(visy , 0 ,sizeof(visy)) ;
- if(find(i))break ;
- int d = inf ;
- for(int j = 1;j <= n;j++)
- if(!visy[j])
- d = min(d , slack[j]) ;
- for(int j = 1;j <= n;j++)
- if(visx[j])
- lx[j] -= d ;
- for(int j = 1;j <= n;j++)
- if(visy[j])
- ly[j] += d ;
- else slack[j] -=d ;
- }
- }
- int ans = 0 ;
- for(int i = 1;i <= n;i++)
- ans += map[match[i]][i] ;
- return ans ;
- }
- int main()
- {
- int t ;
- scanf("%d" , &t) ;
- while(t--)
- {
- scanf("%d%d" , &n , &m) ;
- for(int i = 1;i <= n;i++)
- for(int j = 1;j <= n;j++)
- map[i][j] = -inf ;
- while(m--)
- {
- int u , v , w ;
- scanf("%d%d%d" , &u , &v , &w) ;
- if(u != v && -w > map[u][v])
- map[u][v] = -w ;
- }
- int ans = KM() ;
- printf("%d\n" , -ans) ;
- }
- return 0 ;
- }
hdu3488Tour KM算法的更多相关文章
- 匈牙利算法与KM算法
匈牙利算法 var i,j,k,l,n,m,v,mm,ans:longint; a:..,..]of longint; p,f:..]of longint; function xyl(x,y:long ...
- 【HDU2255】奔小康赚大钱-KM算法
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description ...
- HDU2255-奔小康赚大钱-二分图最大权值匹配-KM算法
二分图最大权值匹配问题.用KM算法. 最小权值的时候把权值设置成相反数 /*-------------------------------------------------------------- ...
- KM算法及其优化的学习笔记&&bzoj2539: [Ctsc2000]丘比特的烦恼
感谢 http://www.cnblogs.com/vongang/archive/2012/04/28/2475731.html 这篇blog里提供了3个链接……基本上很明白地把KM算法是啥讲清楚 ...
- poj 2195 KM算法
题目链接:http://poj.org/problem?id=2195 KM算法模板~ 代码如下: #include "stdio.h" #include "string ...
- hdu 2255 奔小康赚大钱--KM算法模板
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 题意:有N个人跟N个房子,每个人跟房子都有一定的距离,现在要让这N个人全部回到N个房子里面去,要 ...
- HDU(2255),KM算法,最大权匹配
题目链接 奔小康赚大钱 Time Limit: 1000/1000MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- 二分图 最大权匹配 km算法
这个算法的本质还是不断的找增广路: KM算法的正确性基于以下定理:若由二分图中所有满足A[i]+B[j]=w[i,j]的边(i,j)构成的子图(称做相等子图)有完备匹配,那么这个完备匹配就是二分图的最 ...
- hdu 2255 奔小康赚大钱 KM算法
看到这么奇葩的题目名我笑了,后来这么一个裸的KM调了2小时我哭了…… 这是个裸的KM算法,也没什么多说的,主要是注意多组数据时,每次都要把各种数组清空啊,赋值啊什么的,反正比较麻烦.至于为什么调了2小 ...
随机推荐
- Jmeter接口测试---JDBC简单实践
我的环境:MySQL:mysql-5.6.24-win32 jdbc驱动:mysql-connector-java-5.1.22-bin.jar JMeter:apache-jmeter-2.13 1 ...
- Clickhouse DDL&DML
(1)添加列: alter table [db.]table_name add column column_name [type] [default_expr] [after name_after] ...
- POJ_2536_Gopher II
题意:n只地鼠,m个地鼠洞,地鼠必须以v的速度在s秒内钻进洞且每个洞仅能容纳一只地鼠,问最少有几只地鼠会被老鹰吃掉. 分析:最大匹配问题,将s秒内地鼠能够跑到的洞与该地鼠连成一条边,在最后得到的图中使 ...
- Jmeter之JDBC请求参数化(一)
一.环境准备 a.jmeter5.1.1版本最新版本,可以去网页下载:https://jmeter.apache.org/download_jmeter.cgi b.jdbc驱动:链接:https:/ ...
- Duboo学习-SPI
待补充 现将Dubbo-SPI相关源码流程图更新
- 使用JavaScript制作一个好看的轮播图
目录 使用JavaScript制作出好看的轮播图效果 准备材料 1.图片若干张(包括轮播图和按钮的图片) 2.将按钮的图片应用到按钮上的CSS样式文件 3.实现轮播和点击跳转的JavaScript代码 ...
- enote笔记语言(3)(ver0.4)
章节:enote笔记语言(3) what&why(why not)&how&when&where&which:紫色,象征着神秘而又潜蕴着强大的力量,故取 ...
- <MyBatis>入门三 sqlMapper文件
增加 1.增删改在接口中的返回值 Integer.Long.Boolean.void 返回影响多少行 或 true | false 2.mapper 中 增删改没有返回值 (resultType或re ...
- radis入门
redis介绍 是远程的,有客户端.服务端 存内存,吃内存 应用场景 缓存 队列 list操作 push pop 数据存储[根据redis硬盘持久化的机制,这里不展开] 5种数据类型 string 字 ...
- Navicat使用技巧
1.有时按快捷键Ctrl+F搜某条数据的时候搜不到,但是能用sql查出来,这是怎么回事? Ctrl+F只能搜本页数据,不在本页的数据搜不到,navicat每页只显示1000条数据.在数据多的时候nav ...