poj 1149 PIG

来源:互联网 发布:json html 示例输出 编辑:程序博客网 时间:2024/06/06 09:29

建图才是王道,建完图就是裸最大流问题了

建图参考:

http://wenku.baidu.com/view/0ad00abec77da26925c5b01c.html

/*最大流问题*/


#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;


int c[105][105];
int a[105];
int flow[105][105];
int pre[105];
int pig[1005];
bool visit[1005];
int previsitor[1005];


int m,n;
const int inf = 100000000;


void init()
{
    for(int i = 0;i<1005;i++)
    {
        previsitor[i] = 0;
        visit[i] = false;
        pig[i] = 0;
    }
    for(int i = 0;i<105;i++)
       {
           for(int j = 0;j<105;j++)
            {
                c[i][j] = 0;
                flow[i][j] = 0;
            }
           a[i] = 0;
           pre[i] =0;
       }
}


int maxFlow()
{
    int ans = 0;
    queue<int>q;
    while(1)
    {
        memset(a,0,sizeof(a));
        q.push(0);
        a[0] = inf;
        while(!q.empty())
        {
            int temp = q.front();
            q.pop();
            for(int i = 1;i<=n+1;i++)
            {
                if(!a[i]&&c[temp][i]>flow[temp][i])
                {
                    if(c[temp][i]-flow[temp][i]<a[temp])
                    {
                        a[i] = c[temp][i] - flow[temp][i];
                    }
                    else
                        a[i] = a[temp];
                    pre[i] = temp;
                    q.push(i);
                }
            }
        }
        if(a[n+1]==0)
            break;
        for(int i = n+1;i!=0;i=pre[i])
        {
            flow[pre[i]][i] += a[n+1];
            flow[i][pre[i]] -= a[n+1];
        }
        ans+=a[n+1];
    }
    return ans;
}


int main()
{
    while(scanf("%d %d",&m,&n)!=EOF)
    {
        init();
        for(int i = 1;i<=m;i++)
        {
            scanf("%d",&pig[i]);
        }
        for(int i = 1;i<=n;i++)
        {
            int A,B,room;
            scanf("%d",&A);
            for(int j = 0;j<A;j++)
            {
                scanf("%d",&room);
                if(!visit[room])
                {
                    visit[room] = true;
                    c[0][i] += pig[room];
                    previsitor[room] = i;
                }
                else
                {
                    c[previsitor[room]][i] = inf;
                    previsitor[room] = i;
                }
            }
            scanf("%d",&B);
            c[i][n+1] = B;
        }
        int ans = maxFlow();
        printf("%d\n",ans);
    }
    return 0;
}

原创粉丝点击