luogu P2756 飞行员配对方案问题 网络流24

Posted qingyuyyyyy

tags:

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

匈牙利:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<iomanip>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=4004;
int read()
{
    int res=0,ch,flag=0;
    if((ch=getchar())==-)             //判断正负
        flag=1;
    else if(ch>=0&&ch<=9)           //得到完整的数
        res=ch-0;
    while((ch=getchar())>=0&&ch<=9)
        res=res*10+ch-0;
    return flag?-res:res;
}
int n,m;
int result[N],use[N];
int e[N*16],ne[N*16],idx,h[N*16];
void add(int a,int b)
{
    e[idx]=b;
    ne[idx]=h[a];
    h[a]=idx++;
}

bool dfs(int now)
{

    for(int j=h[now]; ~j; j=ne[j])
    {
        int v=e[j];
        if(!use[v])
        {
            use[v]++;
            if(!result[v]||dfs(result[v]))
            {
                result[v]=now;
                return true;
            }
        }
    }
    return false;
}
int main()
{
    idx=0;
    memset(h,-1,sizeof h);
    m=read(),n=read();
    int a,b;
    a=read(),b=read();
    while(a!=-1&&b!=-1)
    {
        add(a,b);
        a=read(),b=read();
    }
    int ans=0;
    for(int i=1; i<=m; i++)
    {
        memset(use,0,sizeof(use));
        if(dfs(i))
            ans++;
    }
    cout<<ans<<endl;
    for(int i=m+1; i<=n; i++)
        if(result[i])
            cout<<result[i]<<" "<<i<<endl;
    return 0;
}

 网络流:

#include <iostream>
#include <cstdio>
#include <cstring>
#define N 100010
using namespace std;
int n,m,S,T,tmp1,tmp2,tot;
int idx,head[N],h[N],q[N],ans1[N],ans2[N];
int e[N],ne[N],w[N];
bool b[N];
inline void add(int u,int v,int f)
{
    e[idx]=v;
    w[idx]=f;
    ne[idx]=head[u];
    head[u]=idx++;
    
    e[idx]=u;
    w[idx]=0;
    ne[idx]=head[v];
    head[v]=idx++;
}
inline bool bfs()
{
    int f=0,t=0;
    memset(h,-1,sizeof(h));
    q[t++]=S;
    h[S]=0;
    while(f<t)
    {
        int now=q[f++];
        for(int i=head[now]; ~i; i=ne[i])
        {
            int v=e[i];
            if(h[v]==-1&&w[i])
            {
                h[v]=h[now]+1;
                q[t++]=v;
            }
        }
    }
    if(h[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(h[v]==h[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)h[x]=-1;
    return used;
}
void dinic()
{
    while(bfs())
        tot+=dfs(S,0x3f3f3f3f);
}
int main()
{
    memset(head,-1,sizeof head);
    scanf("%d %d",&m,&n);
    S=0,T=n+1;
    scanf("%d %d",&tmp1,&tmp2);
    do
    {
        add(tmp1,tmp2,0x3f3f3f3f);
        scanf("%d %d",&tmp1,&tmp2);
    }while(tmp1!=-1&&tmp2!=-1);
    for(int i=1; i<=m; i++)
        add(S,i,1);
    for(int i=m+1; i<=n; i++)
        add(i,T,1);
    dinic();
    if(tot==0)
    {
        puts("No Solution!");
        return 0;
    }
    printf("%d
",tot);
    for(int i=0; i<idx; i=i+2)
    {
        if(e[i]!=S&&e[i^1]!=S)
            if(e[i]!=T&&e[i^1]!=T)
                if(w[i^1]!=0)
                {
                    printf("%d %d
",e[i^1],e[i]);
                }
    }
    return 0;
}

 

以上是关于luogu P2756 飞行员配对方案问题 网络流24的主要内容,如果未能解决你的问题,请参考以下文章

Luogu P2756 飞行员配对方案问题

luogu P2756 飞行员配对方案问题

P2756 飞行员配对方案问题(二分图)

[洛谷P2756]飞行员配对方案问题

洛谷P2756 飞行员配对方案问题

P2756 飞行员配对方案问题