HDU 3488 最小费用圈覆盖
来源:互联网 发布:中国富人区 知乎 编辑:程序博客网 时间:2024/05/20 17:09
题目:给定一幅图,让你找出旅游路径,路径包括一个或者多个环,每个城市只能属于一个环,每个环至少包含两个城市。
可以用网络流,也可以用KM算法求最小值,因为图中给的路径是有向的,且题目保证存在一个完备匹配。
//其实在求最大 最小的时候只要用一个模板就行了,把边的权值去相反数即可得到另外一个.求结果的时候再去相反数即可//邻接矩阵特别需要注意重边的问题,切记#pragma comment(linker,"/STACK:102400000,102400000")#include <iostream>#include <string.h>#include <stdio.h>#include <algorithm>#include <vector>#include <string>#include <math.h>#include <queue>#include <stack>#include <map>#include <set>using namespace std;typedef long long ll; //记得必要的时候改成无符号const int maxn=505;const int INF=1000000000;int n,nx,ny;int march[maxn],lx[maxn],ly[maxn],slack[maxn]; //lx,ly为顶标,nx,ny分别为x点集y点集的个数int visx[maxn],visy[maxn],w[maxn][maxn];int dfs(int x){ visx[x]=1; for(int y=1;y<=ny;y++) { if(visy[y]) continue; int t=lx[x]+ly[y]-w[x][y]; if(t==0) { visy[y]=1; if(march[y]==-1||dfs(march[y])) { march[y]=x; return 1; } } else if(slack[y]>t) //不在相等子图中slack 取最小的 slack[y]=t; } return 0;}int KM(){ int i,j; memset(march,-1,sizeof(march)); memset(ly,0,sizeof(ly)); for(i=1;i<=nx;i++) //lx初始化为与它关联边中最大的 for(j=1,lx[i]=-INF;j<=ny;j++) if(w[i][j]>lx[i]) lx[i]=w[i][j]; for(int x=1;x<=nx;x++) { for(i=1;i<=ny;i++)slack[i]=INF; while(1) { memset(visx,0,sizeof(visx)); memset(visy,0,sizeof(visy)); if(dfs(x)) //若成功(找到了增广轨),则该点增广完成,进入下一个点的增广 break; //若失败(没有找到增广轨),则需要改变一些点的标号,使得图中可行边的数量增加。 //方法为:将所有在增广轨中(就是在增广过程中遍历到)的X方点的标号全部减去一个常数d, //所有在增广轨中的Y方点的标号全部加上一个常数d int d=INF; for(i=1;i<=ny;i++) if(!visy[i]&&d>slack[i]) d=slack[i]; for(i=1;i<=nx;i++) if(visx[i]) lx[i]-=d; for(i=1;i<=ny;i++) //修改顶标后,要把所有不在交错树中的Y顶点的slack值都减去d if(visy[i]) ly[i]+=d; else slack[i]-=d; } } int res=0; for(i=1;i<=ny;i++) if(march[i]>-1) res+=w[march[i]][i]; return res;}int main (){ int T,i,j,m,x,y,z; scanf("%d",&T); while(T--){ scanf("%d%d",&n,&m); nx=ny=n; for(i=1;i<=n;i++)for(j=1;j<=n;j++)w[i][j]=-INF; for(i=1;i<=m;i++){ scanf("%d%d%d",&x,&y,&z); w[x][y]=max(w[x][y],-z); } printf("%d\n",-KM()); } return 0;}
0 0
- HDU 3488 最小费用圈覆盖
- HDU3488Tour(KM最小费用圈覆盖)
- HDU 3488 费用流 圈
- HDU1853Cyclic Tour(KM最小费用圈覆盖)
- HDU3435A new Graph Game(KM最小费用圈覆盖)
- HDU3722 Card Game(KM最小费用圈覆盖)
- HDU 3488 Tour(最小费用流:有向环覆盖)
- hdu1853/ hdu 3488 有向图,取k个圈覆盖所有点一次//费用流
- HDU 3488--Tour【最小费用最大流 && 有向环最小权值覆盖 && 经典】
- HDU 3488 最小费用流
- hdu 1853/3488/3435 最小费用最大流 环覆盖图
- hdu 3488 Tour (有向环最小权值覆盖,费用流)
- HDU 4862 Jump 最小k路径覆盖 费用流
- hdu 4862 最小k路径覆盖 费用流
- ★ HDU 4862 带费用的最小K路径覆盖
- HDU 4862 最小费用最大流+路径覆盖
- poj 2175 最小费用+消圈定理
- 【HDU3488】【匹配】【KM最小费用圈】
- xfire身份验证
- android Activity切换样式
- Android Studio使用教程(一)
- [我的第一篇博文]Mac Book Pro 使用记
- 数学之美系列十八:矩阵运算和文本处理中的分类问题
- HDU 3488 最小费用圈覆盖
- POJ 2823 Sliding Window 单调队列题解
- ios推送消息php做推送服务器
- android 4.4 多媒体创建初始化流程
- IE10 的一些前端有关的特性
- startActivityForResult函数参数说明
- Eclipse工程导入Android Studio以及二者之间差别及常用快捷键说明(二)
- Mondriaan's Dream - POJ 2411 状压dp
- Hebb实例