• POJ 1149 PIGS


    POJ_1149

        这个题目搞得我比较纠结,具体的思想还是看看这篇博客吧。

        http://imlazy.ycool.com/post.2059102.html

    #include<stdio.h>
    #include<string.h>
    #define MAXD 110
    #define MAXM 30010
    #define MAXm 1010
    #define INF 10000000
    int N, M, S, T, e, first[MAXD], work[MAXD], next[MAXM], v[MAXM], flow[MAXM], d[MAXD], q[MAXD];
    int g[MAXD][MAXD], pre[MAXm], cow[MAXm];
    void add(int x, int y, int z)
    {
    v[e] = y;
    flow[e] = z;
    next[e] = first[x];
    first[x] = e;
    e ++;
    }
    void init()
    {
    int i, j, k, n;
    e = 0;
    S = 0, T = N + 1;
    memset(first, -1, sizeof(first));
    memset(g, 0, sizeof(g));
    memset(pre, 0, sizeof(pre));
    for(i = 1; i <= M; i ++)
    scanf("%d", &cow[i]);
    for(i = 1; i <= N; i ++)
    {
    scanf("%d", &n);
    for(j = 0; j < n; j ++)
    {
    scanf("%d", &k);
    if(k > M)
    continue;
    if(!pre[k])
    g[0][i] += cow[k];
    else
    g[pre[k]][i] = 1;
    pre[k] = i;
    }
    scanf("%d", &k);
    add(i, T, k);
    add(T, i, 0);
    }
    for(i = 1; i <= N; i ++)
    if(g[0][i])
    {
    add(0, i, g[0][i]);
    add(i, 0, 0);
    }
    for(i = 1; i <= N; i ++)
    for(j = i + 1; j <= N; j ++)
    if(g[i][j])
    {
    add(i, j, INF);
    add(j, i, 0);
    }
    }
    int bfs()
    {
    int i, j, k, rear = 0;
    memset(d, -1, sizeof(d));
    d[S] = 0;
    q[rear ++] = S;
    for(i = 0; i < rear; i ++)
    for(j = first[q[i]]; j != -1; j = next[j])
    if(flow[j] > 0 && d[v[j]] == -1)
    {
    d[v[j]] = d[q[i]] + 1;
    if(v[j] == T)
    return 1;
    q[rear ++] = v[j];
    }
    return 0;
    }
    int dfs(int cur, int a)
    {
    if(cur == T)
    return a;
    for(int &i = work[cur]; i != -1; i = next[i])
    if(flow[i] > 0 && d[v[i]] == d[cur] + 1)
    if(int t = dfs(v[i], a < flow[i] ? a : flow[i]))
    {
    flow[i] -= t;
    flow[i ^ 1] += t;
    return t;
    }
    return 0;
    }
    void solve()
    {
    int i, j, k, t, cnt = 0;
    while(bfs())
    {
    memcpy(work, first, sizeof(first));
    while(t = dfs(S, INF))
    cnt += t;
    }
    printf("%d\n", cnt);
    }
    int main()
    {
    while(scanf("%d%d", &M, &N) == 2)
    {
    init();
    solve();
    }
    return 0;
    }


  • 相关阅读:
    使用Microsoft.DirectX和Microsoft.DirectX.Sound进行录音时遇到的异常
    一个奇怪的TextChanged事件
    正则表达式
    lambda详解
    AOP统一处理请求
    SpringBoot表单参数验证
    208道Java常见面试题
    Java100道基础面试题
    Java多线程面试题
    Java编码规范
  • 原文地址:https://www.cnblogs.com/staginner/p/2324239.html
Copyright © 2020-2023  润新知