• poj3436


    题意:有一些机器用来构成一个组装电脑的生产线,每台机器对输入机器的电脑有要求,符合要求的电脑被送入机器后会输出一台规定配件情况的电脑。而且分别告知每台机器在单位时间内处理电脑的台数。将这些机器连成一个生产线,使得单位时间内出产的完整的电脑数量最多,完整的电脑就是具有所有配件的电脑。输出单位时间内的最大出产台数。

    分析:这个是一个网络流,对流过每个点的流量有限制,这样就需要拆点,把每个结点拆成两个,一个入点,一个出点,并从入点到出点连接一条边流量为点的的流向限制,把所有接入该点的边接入它的入点,从该点流出的边从出点流出。

    这题的建图方法是,每个机器是一个点,把源与所有没有必须元件的点连接,所有完整元件的点与汇连接,若一台机器的输出能符合另一台机器的输入条件则连一条边。把每个机器拆点,其内部边流量为其生产速度。

    View Code
    #include <iostream>
    #include
    <cstdio>
    #include
    <cstdlib>
    #include
    <cstring>
    usingnamespace std;

    #define maxp 11
    #define maxn 55
    #define inf 0x3f3f3f3f

    struct edge
    {
    int x, y, nxt;
    int c;
    } bf[maxn
    * maxn * maxn];

    struct Machine
    {
    int q, s[maxp], d[maxp];
    } machine[maxn];

    int p, n, s, t, ans;
    int ne, head[maxn], cur[maxn], ps[maxn], dep[maxn];

    void addedge(int x, int y, int c)
    {
    bf[ne].x
    = x;
    bf[ne].y
    = y;
    bf[ne].c
    = c;
    bf[ne].nxt
    = head[x];
    head[x]
    = ne++;
    bf[ne].x
    = y;
    bf[ne].y
    = x;
    bf[ne].c
    =0;
    bf[ne].nxt
    = head[y];
    head[y]
    = ne++;
    }

    int flow(int n, int s, int t)
    {
    int tr, res =0;
    int i, j, k, f, r, top;
    while (1)
    {
    memset(dep,
    -1, n *sizeof(int));
    for (f = dep[ps[0] = s] =0, r =1; f != r;)
    for (i = ps[f++], j = head[i]; j; j = bf[j].nxt)
    {
    if (bf[j].c &&-1== dep[k = bf[j].y])
    {
    dep[k]
    = dep[i] +1;
    ps[r
    ++] = k;
    if (k == t)
    {
    f
    = r;
    break;
    }
    }
    }
    if (-1== dep[t])
    break;

    memcpy(cur, head, n
    *sizeof(int));
    for (i = s, top =0;;)
    {
    if (i == t)
    {
    for (k =0, tr = inf; k < top; ++k)
    if (bf[ps[k]].c < tr)
    tr
    = bf[ps[f = k]].c;
    for (k =0; k < top; ++k)
    bf[ps[k]].c
    -= tr, bf[ps[k] ^1].c += tr;
    res
    += tr;
    i
    = bf[ps[top = f]].x;
    }
    for (j = cur[i]; cur[i]; j = cur[i] = bf[cur[i]].nxt)
    if (bf[j].c && dep[i] +1== dep[bf[j].y])
    break;
    if (cur[i])
    {
    ps[top
    ++] = cur[i];
    i
    = bf[cur[i]].y;
    }
    else
    {
    if (0== top)
    break;
    dep[i]
    =-1;
    i
    = bf[ps[--top]].x;
    }
    }
    }
    return res;
    }

    bool ok(int a, int b)
    {
    if (a == b)
    returnfalse;
    for (int i =0; i < p; i++)
    if (machine[a].d[i] + machine[b].s[i] ==1)
    returnfalse;
    returntrue;
    }

    void input()
    {
    for (int i =1; i <=2* n; i +=2)
    {
    scanf(
    "%d", &machine[i /2].q);
    for (int j =0; j < p; j++)
    scanf(
    "%d", &machine[i /2].s[j]);
    for (int j =0; j < p; j++)
    scanf(
    "%d", &machine[i /2].d[j]);
    addedge(i, i
    +1, machine[i /2].q);
    }
    s
    =0;
    t
    =2* n +1;
    for (int i =0; i < n; i++)
    {
    bool ok =true;
    for (int j =0; j < p; j++)
    if (machine[i].s[j] ==1)
    {
    ok
    =false;
    break;
    }
    if (ok)
    addedge(s, i
    *2+1, inf);
    }
    for (int i =0; i < n; i++)
    {
    bool ok =true;
    for (int j =0; j < p; j++)
    if (machine[i].d[j] !=1)
    {
    ok
    =false;
    break;
    }
    if (ok)
    addedge(i
    *2+2, t, inf);
    }
    for (int i =0; i < n; i++)
    for (int j =0; j < n; j++)
    if (ok(i, j))
    addedge(i
    *2+2, j *2+1, inf);
    }

    bool ok(edge &a)
    {
    if (!(a.c >0&& a.x != s && a.y != s && a.x != t && a.y != t))
    returnfalse;
    if ((a.y &1) &&!(a.x &1) && (a.y +1== a.x))
    returnfalse;
    returntrue;
    }

    void output()
    {
    printf(
    "%d ", ans);
    int ecount =0;
    for (int i =2; i < ne; i++)
    if ((i &1) && ok(bf[i]))
    ecount
    ++;
    printf(
    "%d\n", ecount);
    for (int i =2; i < ne; i++)
    if ((i &1) && ok(bf[i]))
    printf(
    "%d %d %d\n", bf[i].y /2, (bf[i].x +1) /2, bf[i].c);

    }

    int main()
    {
    //freopen("t.txt", "r", stdin);
    scanf("%d%d", &p, &n);
    ne
    =2;
    memset(head,
    0, sizeof(head));
    input();
    ans
    = flow(n *2+2, s, t);
    output();
    return0;
    }
  • 相关阅读:
    [字符串] 洛谷 P2264 情书
    [IDA*] 洛谷 P2324 骑士精神
    [Tarjan] 洛谷 P2746 校园网
    [dp][瞎搞] 洛谷 P2501 数字序列
    [虚树][lca][dfs] 洛谷 P3233 世界树
    [斜率优化][dp] 洛谷 P3648 序列分割
    [带修莫队] Bzoj 2120 数颜色
    [数学][组合数] Jzoj P4257 着色
    [贪心][前缀和] Jzoj P4256 平均数
    [dfs] 洛谷 P2535 收集资源
  • 原文地址:https://www.cnblogs.com/rainydays/p/2095634.html
Copyright © 2020-2023  润新知