luogu P2762 太空飞行计划问题 网络流24

Posted qingyuyyyyy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luogu P2762 太空飞行计划问题 网络流24相关的知识,希望对你有一定的参考价值。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#define N 2000005
using namespace std;
const int inf=(1 << 28);
int n,m,S,T,tmp1,tmp2,tot;
int idx,head[N],cur[N],q[N],ans1[N],ans2[N];
int e[N],ne[N],w[N];
bool b[N];
int r[N],c[N];
bool vis[N];
int ans;
inline void add(int u,int v,int f)
{
    e[idx]=v;
    w[idx]=f;
    ne[idx]=head[u];
    head[u]=idx++;
}
inline bool bfs()
{
    int f=0,t=0;
    memset(cur,-1,sizeof(cur));
    q[t++]=0;
    cur[0]=0;
    while(f<t)
    {
        int now=q[f++];
        for(int i=head[now]; ~i; i=ne[i])
        {
            int v=e[i];
            if(cur[v]==-1&&w[i])
            {
                cur[v]=cur[now]+1;
                q[t++]=v;
            }
        }
    }
    if(cur[T]!=-1)
        return 1;
    return 0;
}
inline int dfs(int x,int f)
{
    if(x==T)
        return f;
    int w1,used=0;
    for(int i=head[x]; ~i; i=ne[i])
    {
        int v=e[i];
        if(cur[v]==cur[x]+1&&w[i])
        {
            w1=dfs(v,min(f-used,w[i]));
            w[i]-=w1;
            w[i^1]+=w1;
            used+=w1;
            if(used==f)
                return f;
        }
    }
    if(!used)
        cur[x]=-1;
    return used;
}
void dinic()
{
    while(bfs())
        ans+=dfs(0,0x3f3f3f3f);
}
int main()
{
    memset(head,-1,sizeof head);
    cin>>m>>n;
    idx=0;
    S=0,T=520;
    int sum=0;
    int x;
    for(int i=1; i<=m; i++)
    {
        int w;
        cin>>w;
        sum+=w;
        add(S,i,w),add(i,S,w);
        while(getchar()== )
        {
            scanf("%d",&x);
            add(i,x+m,inf);
            add(x+m,i,0);
        }
    }
    for(int i=1; i<=n; i++)
    {
        int x;
        cin>>x;
        add(m+i,T,x);
        add(T,m+i,0);
    }
    while(bfs())
        ans+=dfs(S,inf);
    ans=sum-ans;
    for(int i=1; i<=m; i++)
        if(cur[i]!=-1)
            cout<<i<<" ";
    cout<<endl;
    for(int i=1; i<=n; i++)
        if(cur[i+m]!=-1)
            cout<<i<<" ";
    cout<<endl;
    cout<<ans<<endl;
    return 0;
}

 

以上是关于luogu P2762 太空飞行计划问题 网络流24的主要内容,如果未能解决你的问题,请参考以下文章

网络流24题 P2762 太空飞行计划问题

洛谷 P2762 太空飞行计划问题

[luogu2762] [网络流24题] 太空飞行计划问题

洛谷 P2762 太空飞行计划问题

太空飞行计划问题(最大流)

[网络流24题]太空飞行计划问题