hdu3488Tour KM算法
来源:互联网 发布:上海数据分析培训 编辑:程序博客网 时间:2024/06/03 13:16
//给一个有向图,//找出若干环,使得这些环覆盖所有点且每个点只能在一个环中//问所得的所有环的所有边权值之和的最小值为多少//对于每一个点只有一个入度和一个出度,那么将每个点拆成//入度点和出度点,将所有入度点和所有出度点构成一个完备匹配//由于是完备匹配,所以每个点的出度和入度都有一个不是自己的点//相连,那么将完备匹配的所有点连接起来一定是若干环//所得完备匹配的最小匹配即为答案#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 ;}
0 0
- hdu3488Tour KM算法
- hdu3488Tour(KM)
- HDU3488Tour(KM最小费用圈覆盖)
- hdu3488Tour【二分图最大权匹配 KM】
- KM算法。。
- KM算法
- KM算法
- KM算法
- KM算法
- KM算法
- km算法
- km算法
- KM算法
- KM算法
- KM 算法
- KM算法
- KM算法
- KM算法
- 黑马程序员--Java基础学习(环境配置)第一天
- 北大OJ 1001题 Exponentiation涉及的效率问题(整型和字符串转换)
- cocos2d-x在Android真机上使用Sqlite数据库
- 移除未排序链表中的重复结点
- 一段关于Unix与 Linux的暗黑史
- hdu3488Tour KM算法
- 剑指offer 算法 (位运算)
- ios 后退指定 跳转
- C语言结构体排序方法
- poj-2002 Squares
- iPhone开发网站、论坛、博客
- 圆形进度条ProgressBar 的实现方式
- 低功耗蓝牙开发技术概述(一)——基本概念和体系结构
- 杭电(hdu)1181 变形课