#include <iostream>
#include <cstring>
#include <algorithm>
#define MAX 1<<28;
using namespace std;
#define MAX 1<<28;
int lx[50], ly[50];
int map[50][50];
int visitx[50], visity[50];
int match[50], slack[50];
int n, m;

int hungary(int u){
    visitx[u] = 1;
    int temp = 0;
    for(int i = 1; i <= m; i++){
        if(visity[i])
            continue;
        temp = lx[u] + ly[i] - map[u][i];
        if(temp == 0){
            visity[i] = 1;
            if(match[i] == 0 || hungary(match[i])){
                match[i] = u;
                return 1;
            }
        }
        else
            slack[i] = min(slack[i], temp);
    }
    return 0;
}

int km(){
    int temp = 0;
    memset(lx, 0, sizeof(lx));
    memset(ly, 0, sizeof(ly));
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            if(lx[i] < map[i][j])
                lx[i] = map[i][j];
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m; j++)
            slack[j] = MAX;
        while(1){
            memset(visitx, 0, sizeof(visitx));
            memset(visity, 0, sizeof(visity));
            if(hungary(i))
                break;
            else{
            
            temp = MAX;
            for(int j = 1; j <= m; j++)
                if(!visity[j])
                       if(temp > slack[j])
                           temp = slack[j];
    
            if(temp == MAX)
                return 0;     // 无法匹配
            for(int j = 1; j <= n; j++)
                if(visitx[j])
                    lx[j] -= temp;
            for(int j = 1; j <= m; j++)
                if(visity[j])
                    ly[j] += temp;
                else
                    slack[j] -= temp;
            }
        }        
    }    
    return 1;
}

int main(){
    int rewu;
    while(cin >> n){
        cin >> m;
        int res = 0, ans = 0;
        memset(map, 0, sizeof(map));
        memset(match, 0, sizeof(match));
        for(int i = 1; i <= n; i++){
            for(int j = 1; j <= m; j++){
                cin >> map[i][j];
                map[i][j] *= (n+1);
            }
        }
        for(int i = 1; i <= n; i++){
            cin >> rewu;
            res += map[i][rewu];
            map[i][rewu]++;
        }
        km();
        for(int i = 1; i <= m; i++)
            if(match[i] != 0){
                cout << "match[i]: " << match[i] << endl;
                cout << i << "i: " << map[match[i]][i] << " ";
                ans += map[match[i]][i];
            }
        cout << n - res % (n+1) << " " << ans/(n+1) - res/(n+1) << endl;
        cout << res << " "  << ans << endl;
    }
    return 0;
}

找BUG:

最新文章

  1. java 对象 :创建
  2. IKONS – 赞!264 款手工打造的免费矢量图标
  3. IntelliJ IDEA 12.1.4 解决中文乱码
  4. java分页
  5. 单片机C语言编程规范
  6. yii2 改变首页,变成登录页
  7. Nagiosserver端安装部署具体解释(1)
  8. [Cocos2d-x]在Cocos2d-x 3.x如何通过版本号WebSocket连接server数据的传输
  9. 【长 PI】
  10. HDU4704Sum 费马小定理+大数取模
  11. Pipeline in scala——给scala添加管道操作
  12. A million requests per second with Python
  13. 图像转pdf(c#版)
  14. 「loj3058」「hnoi2019」白兔之舞
  15. canvas添加水印
  16. 2018.4.23 深入理解java虚拟机(转)
  17. LAMP学习路线图
  18. c#中//注释和///注释的区别 智能注释 显示换行
  19. Cookie的用法
  20. window连接linux共享

热门文章

  1. [UE4]C++中引用(&amp;)的用法和应用实例
  2. thinkphp 5.0手记
  3. SOAP,RESTFull以及RPC的认识
  4. selenium ie 模拟request pahonjs
  5. c# 导入导出excel表格式
  6. zabbix配合脚本监控Kafka
  7. jpa summary
  8. Win7 系统还原
  9. UI5-文档-4.5-Controllers
  10. (Python)numpy的argmax用法