hdu 3488 Tour (km 二分图 最小权)
2012-05-08 21:34
344 查看
http://acm.hdu.edu.cn/showproblem.php?pid=3488 /* 一开始看题完全蒙了 ,这怎么用二分图解啊,后来开了别人的结题报告 将图中的 入点放到 x集合 出点放到 y集合 看作二分图求解 但是还有一个疑问,为什么看成这样求出来的即使答案呢? 后来仔细想了想,原来 每个点的入点 出现在x集合 那么起出点 也相应的会出现在 x集合 因为每一个点都有至少 一个出点,这样构成的二分图 求其 最小权匹配 即可 */ #include<stdio.h> #define maxn 300 #include<string.h> #define inf 0x6ffffff int n,m; int lx[maxn],ly[maxn],visx[maxn],visy[maxn],slack[maxn]; int linky[maxn]; int w[maxn][maxn]; int find(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(linky[y]==-1||find(linky[y])) { linky[y]=x; return 1; } } else if(slack[y]>t)slack[y]=t; } return 0; } int KM() { int i,j; memset(linky,-1,sizeof(linky)); memset(ly,0,sizeof(ly)); for(i=1;i<=n;i++) { lx[i]=-inf;//与最大权的不同 for(j=1;j<=n;j++) { if(lx[i]<w[i][j]) lx[i]=w[i][j]; } } for(int x=1;x<=n;x++) { for(i=1;i<=n;i++) slack[i]=inf; while(1) { memset(visx,0,sizeof(visx)); memset(visy,0,sizeof(visy)); if(find(x))break; int d=inf; for(i=1;i<=n;i++) { if(!visy[i]&&d>slack[i])d=slack[i]; } for(i=1;i<=n;i++) { if(visx[i])lx[i]-=d; } for(i=1;i<=n;i++) { if(visy[i])ly[i]+=d; else slack[i]-=d; } } } int ans=0; for(i=1;i<=n;i++) { if(linky[i]==-1||w[linky[i]][i]==-inf)return 1;//这里判断是否有完全匹配 else ans+=w[linky[i]][i]; } return ans; } int main() { int T,i,j,a,b,c; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for(i=0;i<=n;i++) { for(j=0;j<=n;j++) w[i][j]=-inf; } for(i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&c); if(-c>w[a][b]) w[a][b]=-c;//与最大全的不同 } printf("%d\n",-KM()); } }
相关文章推荐
- hdoj 2255 奔小康赚大钱 (KM算法 详解+模板) && HDU 1533 Going Home (二分图最小权匹配 KM模板)纯模板
- hdu 2813 One fihgt one(二分图最小权匹配KM)
- HDU 1533 Going Home (二分图最小权匹配 KM模板)
- 【二分图+最小覆盖+简单题】杭电 hdu 1054 Strategic Game
- hdu 1150 二分图 最小点覆盖=最大匹配
- hdu 4160 二分图最小路径覆盖
- hdu Machine Schedule(二分图的最小覆盖)
- hdu 1054 Strategic Game 二分图最小点覆盖
- hdu 2813 One fihgt one【KM 最小匹配】
- hdu National Treasures 二分图的最小点集覆盖
- hdu 1498 二分图—最小点覆盖
- HDU 2063 过山车(匈牙利算法 二分图的最小顶点覆盖 二分图最大匹配)
- HDU 2119--Matrix【二分图 && 最小点数覆盖】
- HDU-2255(记录km算法的板子,km求最大权,最小权匹配)
- (step6.3.3)hdu 1150(Machine Schedule——二分图的最小点覆盖数)
- hdu 1533 Going Home(KM 最小权值匹配)
- hdu 1151 Air Raid(二分图最小路径覆盖)
- HDU 2255 带权二分图 KM模板
- hdu 4160 Dolls 二分图最小路径覆盖
- hdu 1054 Strategic Game (二分图 最小顶点覆盖)