poj PIGS 网络流EK

本文深入探讨了算法优化技术与网络构建策略,通过实例展示了如何利用算法提高效率并构建稳定网络。重点介绍了图建优化、最大流算法及队列应用,旨在提升系统性能与用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这尼玛都能过,太高兴了,意料之外

图建得惨不忍赌啊

#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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值