【KM算法】 奔小康赚大钱 HDU - 2255

10人阅读 评论(0) 收藏 举报
分类:

题目链接

奔小康赚大钱 HDU - 2255

题意

给定一个完全二分图,求最大权匹配

分析

模板题,提交时注意选c++,亲测G++超时。

790ms的代码

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#define INF 0x3f3f3f3f
using namespace std;

const int maxn=330;
int from[maxn],w[maxn][maxn];
int lx[maxn],ly[maxn],visx[maxn],visy[maxn],slack[maxn];
int nx,ny;
///定义slack[y]=min{lx[x]+ly[y]-w[x][y]},x已访问,y未访问

bool Find(int u)
{
    visx[u]=1;
    for(int v=0;v<ny;v++)if(!visy[v])
    {
        int tmp=lx[u]+ly[v]-w[u][v];
        if(tmp==0)
        {
            visy[v]=1;
            if(from[v]==-1 || Find(from[v]))
            {
                from[v]=u;
                return true;
            }
        }
        else slack[v]=min(slack[v],tmp);
    }
    return false;
}
int KM()
{
    for(int i=0;i<nx;i++)
    {
        ly[i]=0;
        lx[i]=-INF;
        for(int j=0;j<ny;j++)
            lx[i]=max(lx[i],w[i][j]);
    }
    memset(from,-1,sizeof(from));
    for(int u=0;u<nx;u++)
    {
        for(int i=0;i<ny;i++) slack[i]=INF;
        while(true)
        {
            memset(visx,0,sizeof(visx));
            memset(visy,0,sizeof(visy));
            if(Find(u)) break;
            int d=INF;
            for(int i=0;i<ny;i++)if(!visy[i])
                d=min(d,slack[i]);
            for(int i=0;i<nx;i++)if(visx[i])
                lx[i]-=d;
            for(int i=0;i<ny;i++)
            {
                if(visy[i]) ly[i]+=d;
                else slack[i]-=d;
            }
        }
    }
    int ans=0;
    for(int i=0;i<ny;i++)
        if(from[i]!=-1) ans+=w[from[i]][i];
    return ans;
}
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        nx=ny=n;
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                scanf("%d",&w[i][j]);
        printf("%d\n",KM());
    }
    return 0;
}

参考博客

模板总结——二分图最大权匹配

查看评论

网络营销-网站盈利方式/淘宝客网络赚钱/广告联盟

-
  • 1970年01月01日 08:00

hdu2255--KM算法

奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub...
  • u011715015
  • u011715015
  • 2013-11-02 17:30:11
  • 1107

奔小康赚大钱(HDU2255,匈牙利算法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 本来是用网络流来做这道题的,但是总是超时,搜索题解,都是用EK(匈牙利)来做的,索性又去学习二分...
  • qust1508060414
  • qust1508060414
  • 2016-01-01 23:06:17
  • 273

hdu 2225 奔小康赚大钱

http://acm.hdu.edu.cn/showproblem.php?pid=2255 奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    Me...
  • w144215160044
  • w144215160044
  • 2015-08-10 08:40:20
  • 405

hdu 2255 KM 奔小康赚大钱

KM算法 基本原理   该算法是通过给每个顶点一个标号(叫做顶标)来把求最大权匹配的问题转化为求完备匹配的问题的。设顶点Xi的顶标为A[ i ],顶点Yj的顶标为B[ j ],顶点Xi与Yj之...
  • MakingMaker
  • MakingMaker
  • 2012-10-12 11:02:06
  • 472

HDU 2255 奔小康赚大钱(KM)

题目链接:HDU 2255 奔小康赚大钱
  • fobdddf
  • fobdddf
  • 2014-06-02 12:57:16
  • 651

HDU 2255 奔小康赚大钱(KM)

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2255 思路:比较裸的KM算法 KM算法讲解的一些地址: 主要思想:http://wenku.baidu...
  • qq_25605637
  • qq_25605637
  • 2016-05-18 21:14:03
  • 194

hdu 2255 奔小康赚大钱(KM算法)

奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub...
  • u011721440
  • u011721440
  • 2014-07-27 12:02:12
  • 711

HDU 2255 奔小康赚大钱 KM算法

奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S...
  • sky_fighting
  • sky_fighting
  • 2012-08-08 20:56:42
  • 1319

[HDU 2255]奔小康赚大钱[KM算法]

题目链接:[HDU 2255]奔小康赚大钱[KM算法] 题意分析: 最佳完美匹配。使连线两边权值只和最大。 解题思路: KM算法之~ 推荐一篇文章:点我 个人感受: KM-KM-KM。...
  • CatGlory
  • CatGlory
  • 2015-11-02 00:54:57
  • 360
    个人资料
    持之以恒
    等级:
    访问量: 3323
    积分: 1172
    排名: 4万+
    文章存档