POJ 1149PIGS(网络流之最大流)

来源:互联网 发布:linux 查看home目录 编辑:程序博客网 时间:2024/06/05 14:31

题目地址:http://poj.org/problem?id=1149

这题重点在于怎样建图。至于怎样建图,我是从一位大牛写的网络流建图汇总里看到的,链接为http://wenku.baidu.com/view/0ad00abec77da26925c5b01c.html

里面讲的很详细,我就不再细说了。代码如下:

#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;int head[1001], s, t, nv, maxint=99999999, cnt, mp[1001][1001];int num[1001], d[1001], cur[1001], pre[1001], q[100000];struct node{    int u, v, cap, next;}edge[20000];void add(int u, int v, int cap){    edge[cnt].v=v;    edge[cnt].cap=cap;    edge[cnt].next=head[u];    head[u]=cnt++;    edge[cnt].v=u;    edge[cnt].cap=0;    edge[cnt].next=head[v];    head[v]=cnt++;}void bfs(){    memset(d,-1,sizeof(d));    memset(num,0,sizeof(num));    int f1=0, f2=0, i;    q[f1++]=t;    num[0]=1;    d[t]=0;    while(f1>=f2)    {        int u=q[f2++];        for(i=head[u];i!=-1;i=edge[i].next)        {            int v=edge[i].v;            if(d[v]==-1)            {                d[v]=d[u]+1;                num[d[v]]++;                q[f1++]=v;            }        }    }}void isap(){    memcpy(cur,head,sizeof(cur));    int flow=0, u=pre[s]=s,i;    bfs();    while(d[s]<nv)    {        if(u==t)        {            int f=maxint, pos;            for(i=s;i!=t;i=edge[cur[i]].v)            {                if(f>edge[cur[i]].cap)                {                    f=edge[cur[i]].cap;                    pos=i;                }            }            for(i=s;i!=t;i=edge[cur[i]].v)            {                edge[cur[i]].cap-=f;                edge[cur[i]^1].cap+=f;            }            flow+=f;            u=pos;        }        for(i=cur[u];i!=-1;i=edge[i].next)        {            if(d[edge[i].v]+1==d[u]&&edge[i].cap)            {                break;            }        }        if(i!=-1)        {            cur[u]=i;            pre[edge[i].v]=u;            u=edge[i].v;        }        else        {            if(--num[d[u]]==0) break;            int mind=nv;            for(i=head[u];i!=-1;i=edge[i].next)            {                if(mind>d[edge[i].v]&&edge[i].cap)                {                    mind=d[edge[i].v];                    cur[u]=i;                }            }            d[u]=mind+1;            num[d[u]]++;            u=pre[u];        }    }    printf("%d\n",flow);}int main(){    int n, m, i, j, a, b, c, k[2000], pig[2000], q;    while(scanf("%d%d",&m,&n)!=EOF)    {        memset(k,0,sizeof(k));        memset(head,-1,sizeof(head));        memset(mp,0,sizeof(mp));        cnt=0;        for(i=1;i<=m;i++)        {            scanf("%d",&pig[i]);        }        s=0;        t=n+1;        nv=t+1;        for(i=1;i<=n;i++)        {            scanf("%d",&q);            while(q--)            {                scanf("%d",&a);                if(!k[a])                {                    mp[s][i]+=pig[a];                }                else                {                    mp[k[a]][i]=maxint;                }                k[a]=i;            }            scanf("%d",&b);            add(i,t,b);        }        for(i=1;i<=n;i++)        {            add(s,i,mp[s][i]);            for(j=1;j<=n;j++)            {                add(i,j,mp[i][j]);            }        }        isap();    }    return 0;}


0 0