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小 ...
随机推荐
- 【转】jvm类加载
类加载机制 JVM把class文件加载的内存,并对数据进行校验.转换解析和初始化,最终形成JVM可以直接使用的Java类型的过程就是加载机制. 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的生命 ...
- C++ 泛型程序设计与STL模板库(1)---泛型程序设计简介及STL简介与结构
泛型程序设计的基本概念 编写不依赖于具体数据类型的程序 将算法从特定的数据结构中抽象出来,成为通用的 C++的模板为泛型程序设计奠定了关键的基础 术语:概念 用来界定具备一定功能的数据类型.例如: 将 ...
- MFC_1.2 消息映射宏 数据绑定和交换
消息映射宏 有三个主要的宏 类内声明 DECLARE_MESSAGE_MAP 表示使用消息映射 在CPP文件中使用 BEGIN_MESSAGE_MAP 和 END_MESSAGE_MAP 包含对应的消 ...
- logging,numpy,pandas,matplotlib模块
logging模块 日志总共分为以下五个级别,这五个级别自下而上进行匹配debug->info->warning->error->critical,默认的最低级别warning ...
- js延时加载的方法
js的延迟加载有助与提高页面的加载速度,以下是延迟加载的几种方法: 1.使用setTimeout延迟方法的加载时间 延迟加载js代码,给网页加载留出更多时间 <script type=" ...
- CLISTCTRL2
回顾: 刚刚写完,因为是分期写的,所以最初想好好做一下的文章格式半途而废了~说的也许会有点啰嗦,但是所有的基础用到的技术细节应该都用到了. 如果还有什么疑问,请回复留言,我会尽力解答. 如果有错误,请 ...
- Vue-prop
HTML 中的特性名是大小写不敏感的,所以浏览器会把所有大写字符解释为小写字符.这意味着当你使用 DOM 中的模板时,camelCase (驼峰命名法) 的 prop 名需要使用其等价的 kebab- ...
- Python之TCP编程
参考原文 廖雪峰Python教程 客户端 我们知道每一条TCP的连接有2个端点,这两个端点叫做套接字socket.如果我们要进行基于TCP的通信必须先创建套接字.在Python中可以这样创建套接字so ...
- springmvc学习及源码地址
http://jinnianshilongnian.iteye.com/blog/1634096
- JAVA实现创建Excel表并导出(转发)
<span style="font-family:Verdana, Arial, Helvetica, sans-serif;line-height:25.2px;background ...