zoukankan      html  css  js  c++  java
  • [HDU 2255] 奔小康赚大钱

    [题目链接]

              http://acm.hdu.edu.cn/showproblem.php?pid=2255

    [算法]

              KM算法模板题

    [代码]

            

    #include<bits/stdc++.h>
    using namespace std;
    #define MAXN 510
    const int INF = INT_MAX;
    
    int n,i,j,delta;
    int la[MAXN],lb[MAXN],match[MAXN];
    int w[MAXN][MAXN];
    bool visiteda[MAXN],visitedb[MAXN];
    
    inline bool dfs(int u)
    {
            int v;
            visiteda[u] = true;
            for (v = 1; v <= n; v++)
            {
                    if (!visitedb[v])
                    {
                            if (la[u] + lb[v] == w[u][v])
                            {
                                    visitedb[v] = true;
                                    if (!match[v] || dfs(match[v]))
                                    {
                                            match[v] = u;
                                            return true;
                                    }
                            } else delta = min(delta,la[u] + lb[v] - w[u][v]);
                    } 
            }
            return false;
    }
    inline int KM()
    {
            int i,j,ret;
            memset(match,0,sizeof(match));
            for (i = 1; i <= n; i++) 
            {
                    la[i] = -INF;
                    lb[i] = 0;
                    for (j = 1; j <= n; j++) la[i] = max(la[i],w[i][j]);
            }
            for (i = 1; i <= n; i++)
            {
                    while (true)
                    {
                            delta = INF;
                            for (j = 1; j <= n; j++) visiteda[j] = visitedb[j] = false;
                            if (dfs(i)) break;
                            for (j = 1; j <= n; j++)
                            {
                                    if (visiteda[j]) la[j] -= delta;
                                    if (visitedb[j]) lb[j] += delta;
                            }
                    }
            }
            ret = 0;
            for (i = 1; i <= n; i++) ret += w[match[i]][i];
            return ret;
    }
    
    int main() 
    {    
            while (scanf("%d",&n) != EOF)
            {
                    for (i = 1; i <= n; i++) 
                    {
                            for (j = 1; j <= n; j++)
                            {
                                    scanf("%d",&w[i][j]);    
                            }    
                    }        
                    printf("%d
    ",KM());
            }
            
            return 0;
        
    }
  • 相关阅读:
    叶问14
    叶问13
    叶问12
    叶问11
    叶问10
    叶问9
    Java三种循环之间的区别
    利用Java对象数组制作简易学生管理系统
    什么叫java方法重载?
    Java编译器的常量优化
  • 原文地址:https://www.cnblogs.com/evenbao/p/9413679.html
Copyright © 2011-2022 走看看