飞行员配对方案
裸的二分图匹配。匈牙利和dinic均可过。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
bool bian[110][110],used[110];
int result[110],n,m;
bool dfs(int now)
{
for(int i=1;i<=m;i++)
{
if(bian[now][i]&&!used[i])
{
used[i]=true;
if(!result[i]||dfs(result[i]))
{
result[i]=now;
return true;
}
}
}
return false;
}
int main()
{
int i,j,ans=0;
int x,y,flag;
scanf("%d%d",&n,&m);
scanf("%d%d",&x,&y);
while(x!=-1&&y!=-1)
{
bian[x][y]=1;
scanf("%d%d",&x,&y);
}
for(i=1;i<=n;i++)
{
memset(used,0,sizeof(used));
if(dfs(i))
{
ans++;
flag=i;
}
}
printf("%d
",ans);
for(i=1;i<=m;i++)
if(result[i])
printf("%d %d
",result[i],i);
return 0;
}