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

poj 2112 Optimal Milking

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

poj 2112 Optimal Milking

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<queue>#include<stack>#include<string>#include<vector>#include<cstdlib>#include<map>#include<set>using namespace std;#define CL(x,v) memset(x,v,sizeof(x));#define R(i,st,en) for(int i=st;i<en;++i)#define LL long long#define inf 0x3f3f3f3fint a[240][240];int K,C,M;const int maxn = 240;int cap[maxn][maxn];int lev[maxn];int n, m;int st, en;bool bfs(){    queue <int> q;    while (!q.empty()) q.pop();    memset(lev, -1, sizeof(lev));    lev[st] = 0;    q.push(st);    while (!q.empty())    {        int u = q.front();q.pop();        for (int v = 0; v <= n+1; ++v) if (lev[v] == -1 && cap[u][v] != 0) {     lev[v] = lev[u] + 1;     q.push(v); }    }    return lev[en] != -1;}int dfs(int u, int cur_flow){    int dt = cur_flow;    if (u == en) return dt;    for (int v = 0; v <= n + 1; ++v)    {        if (cap[u][v] > 0 && lev[u] + 1 == lev[v])        { int flow = dfs(v, min(dt, cap[u][v])); cap[u][v] -= flow; cap[v][u] += flow; dt -= flow;        }    }    return cur_flow - dt;}int dinic(){    int cur_flow, ans = 0;    while(bfs())        while(cur_flow = dfs(st, inf)) ans += cur_flow;    return ans;}void build(int dis){    memset(cap, 0, sizeof(cap));    n = K + C;    st = 0;    en = n + 1;    for (int i = 1; i <= K; ++i)        cap[0][i] += M;    for (int i = K + 1; i <= K + C; ++i)        cap[i][en] += 1;    for (int i = 1; i <= K; ++i)        for (int j = K + 1; j <= K + C; ++j) if (a[i][j] <= dis)     cap[i][j] += 1;}int main(){    while(~scanf("%d%d%d",&K, &C, &M))    {        for (int i = 1; i <= K + C; ++i) for (int j = 1; j <= K + C; ++j) {     scanf("%d", &a[i][j]);     if (a[i][j] == 0) a[i][j] = inf; }        for (int k = 1; k <= K + C; ++k) for (int i = 1; i <= K + C; ++i)     for (int j = 1; j <= K + C; ++j)         a[i][j]= min(a[i][j],a[i][k]+a[k][j]);        int ans = 1, low = 1, high = inf;        while(low <= high)        { int mid = (low + high) >> 1; build(mid); if (dinic() == C) {     ans = mid;     high = mid - 1; } else     low = mid + 1;        }        printf("%dn", ans);    }    return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/375899.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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