HDU 1853 & HDU 3488【有向环最小权值覆盖问题 】最小费用最大流

In the kingdom of Henryy, there are N (2 <= N <= 200) cities, with M (M <= 30000) one-way roads connecting them. You are lucky enough to have a chance to have a tour in the kingdom. The route should be designed as: The route should contain one or more loops. (A loop is a route like: A->B->……->P->A.) 
Every city should be just in one route. 
A loop should have at least two cities. In one route, each city should be visited just once. (The only exception is that the first and the last city should be the same and this city is visited twice.) 
The total distance the N roads you have chosen should be minimized.

Input

An integer T in the first line indicates the number of the test cases. 
In each test case, the first line contains two integers N and M, indicating the number of the cities and the one-way roads. Then M lines followed, each line has three integers U, V and W (0 < W <= 10000), indicating that there is a road from U to V, with the distance of W. 
It is guaranteed that at least one valid arrangement of the tour is existed. 
A blank line is followed after each test case.

Output

For each test case, output a line with exactly one integer, which is the minimum total distance.

Sample Input

1
6 9
1 2 5
2 3 5
3 1 10
3 4 12
4 1 8
4 6 11
5 4 7
5 6 9
6 5 4

Sample Output

42

题意:

给出n个点m条单向边边以及经过每条边的费用,让你求出走过一个哈密顿环(除起点外,每个点只能走一次)的最小费用。

二分图最大权匹配 KM算法

有向环最小权值覆盖问题可以使用KM算法(带权二分图匹配算法)

我们把任意一个顶点i都分成两个,即i和i’. 如果原图存在i->j的边,那么二分图有i->j’的边.

下面我们要引出几条结论:

  1. 如果原图能由多个不相交的有向环覆盖,那么二分图必然存在完备匹配.

(假设原图的有向环为(1->2->3->1) and(6->5->4->6),那么二分图的完备匹配就是1->2’ 2->3’ 3->1’6->5’ 5->4’ 4->6’)

 2.如果二分图存在完备匹配,那么原图必定能由几个不相交的有向环覆盖.

(假设二分图的完备匹配是1->2’ 2->3’ 3->1’ 6->5’ 5->4’ 4->6’那么原图的有向环为(1->2->3->1) and (6->5->4->6))

 3.如果原图存在权值最大的有向环覆盖,那么二分图的最优匹配一定就是这个值.

(因为该有向环覆盖对应了一个二分图的完备匹配,而该完备匹配的权值就等于该有向环覆盖的权值,所以最优匹配不可能丢失该最大权值的匹配)

有解:

现在原题要求的是最小长度匹配,我们把所有已知边的权值都取负数,且那些不存在的边我们取-INF(负无穷). 如果完备匹配存在,那么我们求出的最优匹配权值的绝对值 肯定<INF. 且该绝对值就是最小权值匹配.

无解:

   如果完备匹配不存在,那么最优匹配权值的绝对值 肯定>INF, 或者这么说,如果最终求得的匹配中,有任何一个匹配边用了权值为负无穷的边,那么最优匹配不存在(即完备匹配不存在)

注意:此题输入可能存在重边.

#include<cstdio>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
#define INF 0x3f3f3f3f
const int maxn=1e4+10;
int n,m;
int w[maxn][maxn];
int lx[maxn],ly[maxn];
int link[maxn];
int slack[maxn];
int visx[maxn],visy[maxn];
bool dfs(int x)
{visx[x]=1;for(int y=1;y<=n;y++){if(visy[y]) continue;int t=lx[x]+ly[y]-w[x][y];if(t==0){visy[y]=1;if(link[y]==0||dfs(link[y])){link[y]=x;return 1;}}else if(slack[y]>t) slack[y]=t;}return 0;
}
int km()
{memset(lx,0,sizeof lx);memset(ly,0,sizeof ly);memset(link,0,sizeof link);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(lx[i]<w[i][j])lx[i]=w[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(dfs(i))  break;int d=INF;for(int k=1;k<=n;k++)if(!visy[k]&&d>slack[k])d=slack[k];for(int k=1;k<=n;k++){if(visx[k]) lx[k]-=d;if(visy[k]) ly[k]+=d;}}}int ans=0;for(int i=1;i<=n;i++){//if(w[link[i]][i]==-INF) return -1;ans+=w[link[i]][i];}return -ans;
}
int main()
{int T;scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);int u,v,cost;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)w[i][j]=-INF;for(int i=1;i<=m;i++){scanf("%d%d%d",&u,&v,&cost);cost=-cost;if(w[u][v]!=-INF)//去重边,取权值最小的边建图cost=max(cost,w[u][v]);w[u][v]=cost;//w[v][u]=cost;}printf("%d\n",km());}
}

HDU 1853 HDU 3488【有向环最小权值覆盖问题 】带权二分图匹配 KM算法相关推荐

  1. HDU 2255 奔小康赚大钱 带权二分图匹配 KM算法

    奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  2. 奔小康赚大钱 HDU - 2255( 二分图匹配KM算法详解)

    题目 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子.  这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好有n家老百姓,考虑到每家都要有房住(如果有老百 ...

  3. HDU 1853 HDU 3488【有向环最小权值覆盖问题 】最小费用最大流

    HDU 1853 & HDU 3488[有向环最小权值覆盖问题 ]带权二分图匹配 KM算法 In the kingdom of Henryy, there are N (2 <= N & ...

  4. 【HDU 2255】奔小康赚大钱 (最佳二分匹配KM算法)

    奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  5. 二分图大讲堂——彻底搞定最大匹配数(最小覆盖数)、最大独立数、最小路径覆盖、带权最优匹配

    二分图匹配 二分图大讲堂--彻底搞定最大匹配数(最小覆盖数).最大独立数.最小路径覆盖.带权最优匹配(转) 文本内容框架: §1图论点.边集和二分图的相关概念和性质 §2二分图最大匹配求解 匈牙利算法 ...

  6. ZOJ-2342 Roads 二分图最小权值覆盖

    题意:给定N个点,M条边,M >= N-1.已知M条边都有一个权值,已知前N-1边能构成一颗N个节点生成树,现问通过修改这些边的权值使得最小生成树为前N条边的最小改动总和为多少? 分析:由于计算 ...

  7. HDU 2063 过山车 二分图匹配 匈牙利算法

    过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  8. Assignment HDU - 2853(二分图匹配 KM)

    传送门:QAQ 题意:给了你n个公司和m个任务,然后给你了每个公司处理每个任务的效率.然后他已经给你了每个公司的分配方案,让你求出最多能增大多少效率(即最大权值匹配减去原来的),然后问你至少要修改多少 ...

  9. HDU - 3488 Tour(二分图最小权匹配+KM)

    题目链接:点击查看 题目大意:给出n个城市,再给出m条有向的道路,问若想以一个或多个环的形式遍历所有的城市一次,所需要的最小权值是多少 题目分析:刚拿到这个题目是有点懵的,因为不知道题目让求什么,其实 ...

最新文章

  1. python爬虫一般格式
  2. RecyclerView IndexOutOfBoundException
  3. [王晓刚]深度学习在图像识别中的研究进展与展望(转发)
  4. 今天开始学Pattern Recognition and Machine Learning (PRML),章节1.6,Information Theory信息论简介
  5. 服务器性能 平均磁盘写入,磁盘系统IO性能测试
  6. C++中结构体、联合体、枚举的区别
  7. 异步asynctask
  8. C语言头文件 “ 细节 ”
  9. java数组的扩容,将两个数组合并成一个数组
  10. Fibonacci思想的灵活应用(洛谷P1011题题解,Java语言描述)
  11. tensorflow之成品模型
  12. 那一年马云34岁,李彦宏30岁,马化腾27岁
  13. 为什么空集是集合的子集_空集是任何集合的子集对吗
  14. 日常运维-端口查询篇
  15. Android中BottomSheetDialog如何设置透明背景
  16. 3运输层 - 可靠数据传输的原理rdt
  17. CSS表格与浮动定位
  18. 家庭版Windows10/Windows11不支持远程桌面的解决办法
  19. QT中打开网址或者html文件
  20. Mybatis-原理总结

热门文章

  1. 【剑指offer】21、调整数组顺序使奇数在偶数前面
  2. IDEA Error:java: Compilation failed: internal java compiler error
  3. Mybatis_映射文件配置
  4. 关于小程序取data- 的值的问题
  5. 天气预报接口和城市代码
  6. NASM、MASM浅谈
  7. kubeadm部署k8s_(Ansible)三分钟部署一套高可用/可扩展的kubeadm集群
  8. linux读取每条内存使用,Linux c读取系统内存使用信息
  9. android 直播 app下载地址,蓝泡泡直播
  10. csp2020 j2民间数据下载_华为麒麟 990 5G 下载速率领先