------------------------------------------------------------------------------------

 17/24 

------------------------------------------------------------------------------------

    开坑了...中考前看看能不能填完(总感觉会TJ...QwQ) TJ啦23333333

  1.飞行员配对问题(二分图最大匹配

  裸匈牙利。

#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
using namespace std;
struct poi{int too,pre;}e[20000];
int link[210],last[210],v[210],x,y,n,m,tot,t,ans;
void read(int &k)
{
    k=0;int f=1;char c=getchar();
    while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
    while(c<='9'&&c>='0')k=k*10+c-'0',c=getchar();
    k*=f;
}
void add(int x,int y){e[++tot].too=y;e[tot].pre=last[x];last[x]=tot;}
bool dfs(int x)
{
    for(int i=last[x],too=e[i].too;i;i=e[i].pre,too=e[i].too)
    if(v[too]!=t)
    {
        v[too]=t;
        if((!link[too])||dfs(link[too]))
        {
            link[too]=x;
            return 1;
        }
    }
    return 0;
}
int main()
{
    read(n);read(m);
    read(x);read(y);
    while(x!=-1&&y!=-1)
    {
        add(y,x);
        read(x);read(y);
    }
    for(int i=n+1;i<=n+m+1;i++)
    {
        t++;
        if(dfs(i))ans++;
    }
    printf("%d\n",ans);
    for(int i=1;i<=n;i++)
    if(link[i])printf("%d %d\n",i,link[i]);
}
View Code

相关文章: