HDU 1853 Cyclic Tour(二分图最优匹配:有向环覆盖)
来源:互联网 发布:android ddms源码 编辑:程序博客网 时间:2024/05/21 19:32
题意:给你一个N个点M条边的带权有向图,现在要你求这样一个值:该有向图中的所有顶点正好被1个或多个不相交的有向环覆盖.这个值就是 所有这些有向环的权值和. 要求该值越小越好.
思路:我们把任意一个顶点i都分成两个,即i和i’. 如果原图存在i->j的边,那么二分图有i->j’的边,费用小把权值取负
#include<cstdio>#include<cstring>#include<algorithm>#define INF 1e9using namespace std;const int maxn=100+10;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++) { if(W[left[i]][i]==-INF) return -1; //找不到 ans += W[left[i]][i]; } return -ans;//注意这里返回的是负值 }}KM;int main(){ int n,m; while(scanf("%d%d",&n,&m)==2) { 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 1853 Cyclic Tour(二分图最优匹配:有向环覆盖)
- HDU 1853 Cyclic Tour(二分图最优匹配:有向环覆盖)
- HDU 1853 Cyclic Tour(二分图最优匹配:有向环覆盖)
- HDU 3488 Tour(二分图最优匹配:有向环覆盖)
- HDU 3488 Tour(二分图最优匹配:有向环覆盖)
- Cyclic Tour (最优二分匹配)
- HDU 1853 Cyclic Tour(二分图最优匹配) 解题报告
- HDU 3435 A new Graph Game(二分图最优匹配:有向环覆盖)
- HDU 3435 A new Graph Game(二分图最优匹配:有向环覆盖)
- HDU 3435 A new Graph Game(二分图最优匹配:有向环覆盖)
- HDU 1853--Cyclic Tour【最小费用最大流 && 有向环最小权值覆盖 】
- hdu 1853 Cyclic Tour (有向环最小权值覆盖,费用流)
- HDU 1853 Cyclic Tour(最佳二分图匹配寻找图中的环)
- hdu3488——Tour(有向环覆盖,二分图最佳匹配)
- HDU1853 Cyclic Tour(有向环最小覆盖)
- HDU3488 Cyclic Tour(有向环最小覆盖)
- hdu 1853 Cyclic Tour(费用流OR二分图最佳匹配,5级)
- HDU 1853 Cyclic Tour【最小费用最大流 OR 带权二分图匹配】
- u-boot-1.1.6在FS2410开发板上的移植
- iOS的三种多线程技术
- 线程基础:JDK1.5+(10)——线程新特性(下)
- Web动画性能指南
- java学习日记——基本操作02
- HDU 1853 Cyclic Tour(二分图最优匹配:有向环覆盖)
- Linux 守护进程
- spring framework 下载地址
- MySQL乱码问题解决总结
- 215Kth Largest Element in an Array
- TI CC254X函数库说明续(BLE GATT.h)
- Servlet执行过程
- 我想创业
- 手淘适配设置模板