您的位置:首页 > 理论基础 > 计算机网络

poj PIGS 网络流EK

2015-07-26 10:29 537 查看
这尼玛都能过,太高兴了,意料之外

图建得惨不忍赌啊

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

const int inf = 0x7f7f7f7f;
int a[1100];
int p[405][405];
int pre[405];
int maxflow=0;
queue<int>q;
int sp,sf;
int vis[1100];
int flow[405];
int tmp[405];
int mm;
void bfs()
{
    while(q.size())
        q.pop();
    q.push(sp);
    memset(vis,0,sizeof(vis));
    memset(pre,-1,sizeof(pre));
    int u,v;
    vis[sp]=1;
    flow[sp]=inf;
    while(q.size()&&vis[sf]==0)
    {
        u=q.front();
        q.pop();
        for(v=0;v<=sf;v++)
        {
            if(!vis[v]&&p[u][v])
            {
                flow[v]=min(flow[u],p[u][v]);
                vis[v]=1;
                pre[v]=u;
                q.push(v);
            }
        } 
    }
    return ;
}
void max_flow()
{
    while(1)
    {
        bfs();
        if(vis[sf]==0)
        {
            break;
        }
        int s=sf;
        while(pre[s]!=-1)
        {
            p[pre[s]][s]-=flow[sf];
            p[s][pre[s]]+=flow[sf];
            s=pre[s];
        }
        maxflow+=flow[sf];
    }
    return ;
}
stack<int>temp;
int main()
{
    int m,n;
    cin>>m>>n;
    int i,j;
    memset(vis,0,sizeof(vis));
    memset(p,0,sizeof(p));
    for(i=1;i<=m;i++)
        cin>>a[i];
    int x,y;
    sp=0;
    sf=400; 
    int sum1,sum2;
    mm=1;
    int k;
    for(i=1;i<=n;i++)
    {
        cin>>x;
        for(j=1;j<=x;j++)
        {
            cin>>tmp[j];
        }
        cin>>y;
        k=0;
        sum2=0;
        for(j=1;j<=x;j++)
        {
            if(vis[tmp[j]])
            {
                k=vis[tmp[j]];
                temp.push(k); //一开始没有压栈保存,以为只保存一个就行了,然后WA.
            }
            else
            {
                sum2+=a[tmp[j]];
                vis[tmp[j]]=mm+1;
            }
        }
        if(sum2)
        {
            p[sp][mm]=inf;
            p[mm][mm+1]=sum2;
            mm++;
        }
        if(temp.size())
        {
            while(temp.size())
            {
                p[temp.top()][mm]=inf;
                temp.pop();
            }
        }
        p[mm++][sf]=y;
    }
    max_flow();
    cout<<maxflow<<endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: