hdu3488 Tour (KM最小权值和)
2013-09-08 20:28
295 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3488
题解:对于环上的每个点,入度=出度=1,将每个点拆成入点和出点,相当于左边n个城市,右边n个城市,求最优匹配。由最优匹配的性质得,每个点都会在匹配中。相当于一个点出现两次,即一次入度,一次出度。任何完全图的二分匹配其实就是n个环的并。
题解:对于环上的每个点,入度=出度=1,将每个点拆成入点和出点,相当于左边n个城市,右边n个城市,求最优匹配。由最优匹配的性质得,每个点都会在匹配中。相当于一个点出现两次,即一次入度,一次出度。任何完全图的二分匹配其实就是n个环的并。
#include <stdio.h> #include <string.h> #include <math.h> #define INF 0x3f3f3f3f #define MAXN 201 int w[MAXN][MAXN],match[MAXN],n; int lx[MAXN],ly[MAXN],slack[MAXN]; int visitx[MAXN],visity[MAXN]; int Scan() { char ch; int ret=0; while((ch=getchar())<'0'||ch>'9'); while(ch>='0'&&ch<='9') { ret=ret*10+(ch-'0'); ch=getchar(); } return ret; } int find(int x) { int i,temp; visitx[x]=1; for(i=1;i<=n;++i) { if(visity[i]) continue; temp=lx[x]+ly[i]-w[x][i]; if(temp==0) { visity[i]=1; if(match[i]==-1||find(match[i])) { match[i]=x;//找到增广轨 return 1; } } else if(slack[i]>temp) {//不在相等子图中slack 取最小的 slack[i]=temp; } } return 0; } void KM() { int i,j,d; memset(ly,0,sizeof(ly)); memset(match,-1,sizeof(match)); for(i=1;i<=n;++i) {//lx初始化为与它关联边中最大的 lx[i]=w[i][1]; for(j=2;j<=n;++j) if(w[i][j]>lx[i]) lx[i]=w[i][j]; } for(i=1;i<=n;++i) { for(j=1;j<=n;++j) slack[j]=INF; while(1) { memset(visitx,0,sizeof(visitx)); memset(visity,0,sizeof(visity)); if(find(i)) break; d=INF; for(j=1;j<=n;++j) { if(!visity[j]&&d>slack[j]) d=slack[j]; } for(j=1;j<=n;++j) { if(visitx[j]) lx[j]-=d; if(visity[j]) ly[j]+=d; else slack[j]-=d; } } } } int main() { int u,v,W,m,test,ans; scanf("%d",&test); while(test--) { n=Scan(); m=Scan(); for(v=0;v<=n;++v) { for(u=0;u<=n;++u) w[v][u]=~INF+1; } while(m--) { u=Scan(); v=Scan(); W=Scan(); W=~W+1;//取反 if(W>w[u][v]) w[u][v]=W; } KM(); ans=0; for(v=1;v<=n;++v) { if(match[v]!=-1) ans+=w[match[v]][v]; } printf("%d\n",~ans+1); } return 0; }
相关文章推荐
- hdu 1853 Cyclic Tour (二分匹配KM最小权值 或 最小费用最大流)
- hdu 1853 Cyclic Tour(KM 最小权值匹配)
- hdu 3488 Tour (有向环最小权值覆盖,费用流)
- POJ 2195 Going Home(BFS+KM求最小权值)
- hdu 1853 Cyclic Tour 求图中不相交的l个环的最小权值:首先变成完全图(i->j=inf),然后取反,求最大权值,最后判断是否所有点都选到
- HDU 3488 Tour(最小费用流:有向环最小权值覆盖)
- poj2195_KM最小权值和
- 【HDU3488】【匹配】【KM最小费用圈】
- HDU3488 Tour(二分图最小完备匹配,KM算法,转化思想)
- HDU3488 Cyclic Tour(有向环最小覆盖)
- hdu2813 One fihgt one (KM最小权值和)
- HDU 1853 Cyclic Tour[有向环最小权值覆盖]
- hdu 1533 Going Home(KM 最小权值匹配)
- hdu 1853 Cyclic Tour (有向环最小权值覆盖,费用流)
- HUD3488 Tour(二分图的最小权值和)
- HDU 3488--Tour【最小费用最大流 && 有向环最小权值覆盖 && 经典】
- hdu1598 求满足最大权值最小权值差最小的生成树
- Kruskal 最小生成树(输出最小生成树的路径,权值的和) 参考poj 1258
- HDU 1853--Cyclic Tour【最小费用最大流 && 有向环最小权值覆盖 】
- HDU3488-Tour