zoukankan      html  css  js  c++  java
  • POJ 3469 Dual Core CPU

    POJ_3469

        纠结了好久,终于仿写成了非递归的dinic……

    #include<stdio.h>
    #include<string.h>
    #define INF 1000000000
    #define MAXD 20010
    #define MAXM 1000010
    int A[MAXD], B[MAXD], f[MAXM], N, M, e;
    int first[MAXD], next[MAXM], u[MAXM], v[MAXM], d[MAXD];
    int q[MAXD], s[MAXD], work[MAXD];
    void add(int a, int b, int w)
    {
    u[e] = a;
    v[e] = b;
    f[e] = w;
    next[e] = first[a];
    first[a] = e;
    e ++;
    }
    int init()
    {
    int i, j, k, a, b, w;
    if(scanf("%d%d", &N, &M) != 2)
    return 0;
    for(i = 1; i <= N; i ++)
    scanf("%d%d", &A[i], &B[i]);
    memset(first, -1, sizeof(first));
    e = 0;
    for(i = 1; i <= N; i ++)
    {
    add(0, i, A[i]);
    add(i, 0, 0);
    add(i, N + 1, B[i]);
    add(N + 1, i, 0);
    }
    for(i = 0; i < M; i ++)
    {
    scanf("%d%d%d", &a, &b, &w);
    add(a, b, w);
    add(b, a, w);
    }
    return 1;
    }
    int bfs()
    {
    int i, j, rear;
    memset(d, -1, sizeof(d));
    rear = 0;
    q[rear ++] = 0;
    d[0] = 0;
    for(i = 0; i < rear; i ++)
    for(j = first[q[i]]; j != -1; j = next[j])
    if(f[j] > 0 && d[v[j]] == -1)
    {
    d[v[j]] = d[q[i]] + 1;
    if(v[j] == N + 1)
    return 1;
    q[rear ++] = v[j];
    }
    return 0;
    }
    int dinic()
    {
    int cur, res = 0, r;
    while(bfs())
    {
    memcpy(work, first, sizeof(first));
    r = 0;
    cur = 0;
    for(;;)
    {
    if(cur == N + 1)
    {
    int minr = 0, a = INF;
    for(int i = 0; i < r; i ++)
    if(f[s[i]] < a)
    {
    a = f[s[i]];
    minr = i;
    }
    for(int i = 0; i < r; i ++)
    {
    f[s[i]] -= a;
    f[s[i] ^ 1] += a;
    }
    r = minr;
    cur = u[s[r]];
    res += a;
    }
    int i;
    for(i = work[cur]; i != -1; i = next[i])
    {
    if(f[i] == 0)
    continue;
    if(d[cur] + 1 == d[v[i]])
    break;
    }
    work[cur] = i;
    if(i != -1)
    {
    s[r ++] = i;
    cur = v[i];
    }
    else
    {
    d[cur] = -1;
    if(r == 0)
    break;
    r --;
    cur = u[s[r]];
    }
    }
    }
    return res;
    }
    int main()
    {
    while(init())
    {
    int res = dinic();
    printf("%d\n", res);
    }
    return 0;
    }


  • 相关阅读:
    单例模式
    spring boot 调度任务
    linux yum安装MySQL5.6
    day5模块学习--sys模块
    day5模块学习 -- os模块学习
    day5模块学习--random模块
    day5模块学习 -- time、datetime时间模块
    生成随机验证码的方法
    SQL中format()函数对应的格式
    day4作业小代码练习
  • 原文地址:https://www.cnblogs.com/staginner/p/2209605.html
Copyright © 2011-2022 走看看