HDU 3488 Tour(二分图最优匹配:有向环覆盖)
来源:互联网 发布:薄暮知秋什么意思 编辑:程序博客网 时间:2024/06/06 18:27
HDU 3488 Tour(二分图最优匹配:有向环覆盖)
http://acm.hdu.edu.cn/showproblem.php?pid=3488
题意:
给你一个N个顶点M条边的带权有向图,要你把该图分成1个或多个不相交的有向环.且所有定点都被有向环覆盖.问你该有向环所有权值的总和最小是多少?(保证有解)
分析:
这就是有向图的不相交环覆盖问题,直接用KM算法可以求得最大权值解,这里要求最小权值解,所以只需要把所有边权值取负即可.
具体的分析可以参考HDU1853:
http://blog.csdn.net/u013480600/article/details/38760767
AC代码:
#include<cstdio>#include<cstring>#include<algorithm>#define INF 1e9using namespace std;const int maxn=200+5;struct Max_Match{ int n, W[maxn][maxn]; int Lx[maxn],Ly[maxn]; bool S[maxn],T[maxn]; int left[maxn]; bool match(int i) { S[i]=true; for(int j=1;j<=n;j++)if(Lx[i]+Ly[j]==W[i][j] && !T[j]) { T[j]=true; if(left[j]==-1 || match(left[j])) { left[j]=i; return true; } } return false; } void update() { int a=1<<30; for(int i=1;i<=n;i++)if(S[i]) for(int j=1;j<=n;j++)if(!T[j]) a=min(a, Lx[i]+Ly[j]-W[i][j]); for(int i=1;i<=n;i++) { if(S[i]) Lx[i]-=a; if(T[i]) Ly[i]+=a; } } int solve(int n) { this->n=n; memset(left,-1,sizeof(left)); for(int i=1;i<=n;i++) { Lx[i]=Ly[i]=0; for(int j=1;j<=n;j++) Lx[i]=max(Lx[i], W[i][j]); } for(int i=1;i<=n;i++) { while(true) { for(int j=1;j<=n;j++) S[j]=T[j]=false; if(match(i)) break; else update(); } } int ans=0; for(int i=1;i<=n;i++) ans += W[left[i]][i]; return -ans; }}KM;int main(){ int T; scanf("%d",&T); while(T--) { int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) KM.W[i][j]=-INF; while(m--) { int u,v,w; scanf("%d%d%d",&u,&v,&w); KM.W[u][v]= max(KM.W[u][v], -w); } printf("%d\n",KM.solve(n)); } return 0;}
0 0
- HDU 3488 Tour(二分图最优匹配:有向环覆盖)
- HDU 3488 Tour(二分图最优匹配:有向环覆盖)
- HDU 1853 Cyclic Tour(二分图最优匹配:有向环覆盖)
- HDU 1853 Cyclic Tour(二分图最优匹配:有向环覆盖)
- HDU 1853 Cyclic Tour(二分图最优匹配:有向环覆盖)
- HDU 3435 A new Graph Game(二分图最优匹配:有向环覆盖)
- HDU 3435 A new Graph Game(二分图最优匹配:有向环覆盖)
- HDU 3435 A new Graph Game(二分图最优匹配:有向环覆盖)
- hdu3488——Tour(有向环覆盖,二分图最佳匹配)
- hdu 3488 Tour(二分图的最优匹配)
- HDU 3488 Tour(最小费用流:有向环覆盖)
- hdu 3488 Tour【二分图权匹配】
- Cyclic Tour (最优二分匹配)
- HDU 3488--Tour【最小费用最大流 && 有向环最小权值覆盖 && 经典】
- hdu 3488 Tour (有向环最小权值覆盖,费用流)
- HDU 1853 Cyclic Tour(二分图最优匹配) 解题报告
- hdu - 3488 - Tour(二分图最佳完美匹配)
- HDU 1853--Cyclic Tour【最小费用最大流 && 有向环最小权值覆盖 】
- ”树莓派“安装libjpeg库
- PAT 1004 Counting Leaves
- 【android】编程规范、常用技巧和性能优化
- Java排序算法(一):概述
- 【C#基础】【语法02】课堂作业题 01-08
- HDU 3488 Tour(二分图最优匹配:有向环覆盖)
- Spring框架搭建
- Java排序算法(二):直接选择排序
- opencv常用函数(c++版本)
- Java排序算法(三):堆排序
- 【OpenCV】数字图像灰度直方图
- Java排序算法(四):冒泡排序
- asp.net微信公众平台开发
- 划线实现"黑白跑游戏"模拟