求助 网络流
查看原帖
求助 网络流
115359
phigy楼主2021/5/20 15:10

第三次发了 。

已经交了一页了 。

#include <iostream>
#include <cstring>
#include <queue>

#define int long long

using namespace std;

int n,m,s,t=10000;

struct edge
{
    int to,next,dis;
}e[1000005];
int cnt=1,head[1000005];

void add(int x,int y,int z)
{
    cnt++;
    e[cnt].to=y;
    e[cnt].dis=z;
    e[cnt].next=head[x];
    head[x]=cnt;
}

int vis[1000005];
int d[1000005];

int bfs()
{
    queue<int> q;
    q.push(s);
    d[s]=1;
    while(!q.empty())
    {
        int x=q.front();
        q.pop();
        for(int i=head[x];i;i=e[i].next)
        {
            int v=e[i].to;
            if(e[i].dis&&!d[v])
            {
                d[v]=d[x]+1;
                if(v==t)return 1;
                q.push(v);
            }
        }
    }
    return 0;
}

int dfs(int x,int flow)
{
    if(x==t)return flow;
    int ans=0;
    for(int i=head[x];i&&flow;i=e[i].next)
    {
        int v=e[i].to;
        if(e[i].dis==0||d[v]!=d[x]+1)continue;
        int res=0;
        res=dfs(v,min(flow,e[i].dis));
        if(res==0)
        {
            d[v]=2e14;
        }
        e[i].dis-=res;
        e[i^1].dis+=res;
        ans+=res;
        flow-=res;
    }
    return ans;
}
signed main()
{
    int i,j,k;
    cin>>n>>m;
    for(i=1;i<=m;i++)
    {
        int x;
        cin>>x;
        if(x==1)add(s,i,1),add(i,s,0);
        else add(i,t,1),add(t,i,0);
    }
    for(i=1;i<=m;i++)
    {
        int x,y;
        cin>>x>>y;
        add(x,y,1);
        add(y,x,1);
    }
    int ans=0,res=0;
    while(bfs())
    {
        ans+=dfs(s,2e14);
        memset(d,0,sizeof(d));
    }
    cout<<ans;
    return 0;
}
2021/5/20 15:10
加载中...