栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

zoj 3035 The Finest Chef

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

zoj 3035 The Finest Chef

#include <map>#include <cstdio>#include <algorithm>using namespace std;const int inf = 1000000000;const int MAXN = 350;template<typename T>T KuhnMunkras(int nx, int ny, int mx[], int my[], T xy[][MAXN], T lx[], T ly[]){    T ret = 0;    static int p, t, q[MAXN], pre[MAXN];    for (int i = 0; i < nx; i++) {        lx[i] = *max_element(xy[i], xy[i] + ny);    }    fill(ly, ly + ny, 0);    fill(mx, mx + nx, -1);    fill(my, my + ny, -1);    for (int i = 0; i < nx; i++) {        fill(pre, pre + ny, -1);        q[0] = i;        p = 0;        t = 1;        while (p < t) { for (int j = 0; j < ny; j++) {     if (lx[q[p]] + ly[j] == xy[q[p]][j] && pre[j] == -1) {         pre[j] = q[p];         if (my[j] == -1) {  int y, yy = j;  do {      y = yy;      yy = mx[pre[y]];      mx[pre[y]] = y;      my[y] = pre[y];  } while (yy != -1);  t = -1;  break;         }         else {  q[t++] = my[j];         }     } } ++p;        }        if (mx[i] == -1) { ret = inf; for (int j = 0; j < t; j++) {     for (int k = 0; k < ny; k++) {         if (pre[k] == -1) {  ret = min(ret, lx[q[j]] + ly[k] - xy[q[j]][k]);         }     } } for (int j = 0; j < t; j++) {     lx[q[j]] -= ret; } for (int k = 0; k < ny; k++) {     if (pre[k] != -1) {         ly[k] += ret;     } } --i;         }    }    ret = 0;    for (int i = 0; i < nx; i++) {        ret += xy[i][mx[i]];    }    return ret;}int xy[250][350];int mx[250], my[350];int lx[250], ly[350];int get_id(map<int, int>& mp, int id){    if (mp.count(id) == 0) {        mp.insert(make_pair(id, (int)mp.size()));    }    return mp[id];}int main(){    int re, nx, ny, m;    int a, b, c;    scanf("%d", &re);    while (re--) {        map<int, int> mpx, mpy;        scanf("%d%d", &nx, &ny);        for (int i = 0; i < nx; i++) { for (int j = 0; j < ny; j++) {     xy[i][j] = -inf; }        }        scanf("%d", &m);        while (m--) { scanf("%d%d%d", &a, &b, &c); xy[get_id(mpx, a)][get_id(mpy, b)] = -c;        }        printf("%dn", -KuhnMunkras<int>(nx, ny, mx, my, xy, lx, ly));    }    return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/376100.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号