zoukankan      html  css  js  c++  java
  • 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;
    }


  • 相关阅读:
    c#redis使用
    不安全的HTTP方法(渗透实验)
    arguments.callee弃用与webuploader
    多线程系列1:经典卖票
    终于确定了系统lsass.exe占用cpu的根本原因了,速度来看一看!![转载]
    edit响应键盘的“咚咚”声音去掉
    delphi资源文件制作及使用详解
    MySQL server has gone away错误的解决办法
    MySQL server has gone away的解决方法
    MySQL
  • 原文地址:https://www.cnblogs.com/staginner/p/2324239.html
Copyright © 2011-2022 走看看