题解 洛谷P2756 网络流24题.04 【飞行员配对方案问题】

\(\huge\mathbb{DESCRIPTION}\)
编号:洛谷\(P2756\)\(LOJ6000\)(与洛谷上本题输入和输出格式都有不同)
算法:网络最大流\(\mathbb{OR}\)二分图
来源:网络流\(24\)
\(\huge\mathbb{SOLUTION}\)
诶,必须吐槽一句,为什么我做网络流\(70\%\)以上都没用网络流呢?
好吧,这道题目是一道较好的网络最大流的题目。
然后,我随手写了一个二分图,大约\(30ms\)就跑过了。
首先,我们把所有的可以配对的飞行员都输入进来。
然后,我们枚举每一名飞行员,搜索是否有人还能和他匹配。
最后输出一下即可。

这里还要补充一件事情:

本来我没学过二分图,结果写了个暴力搜索。
然后大佬\(SKC\)告诉我写出了二分图的模板...
很多同学存图喜欢用链式前向星
然而作者我并不喜欢,我认为\(STL\)中的\(Vector\)更加方便。
读者:万恶的作者!
作者:。。。
\(\huge\mathbb{CODE}\)

#include<bits/stdc++.h>
using namespace std;
int Total,Foreign;
int Match[1001];
bool Visit[1001];
vector<int>Edge[1001];
inline bool Dfs(int Now)
{
	register int i;
	for(i=0;i<Edge[Now].size();i++)
	{
		register int Next;
		Next=Edge[Now][i];
		if(!Visit[Next])
		{
			Visit[Next]=true;
			if(!Match[Next]||Dfs(Match[Next]))
			{
				Match[Next]=Now;
				return true; 
			} 
		}
	}
	return false;
}
int main(void)
{
	register int i;
	cin>>Foreign>>Total;
	while(true)
	{
		register int U,V;
		cin>>U>>V;
		if(U==-1&&V==-1)
		{
			break;
		}
		Edge[U].push_back(V);
	}
	register int Sum=0; 
	for(i=1;i<=Total;i++)
	{
		memset(Visit,false,sizeof(Visit));
		if(Dfs(i))
		{
			Sum++;
		}
	}
	cout<<Sum<<endl;
	for(i=Foreign+1;i<=Total;i++)
	{
		if(Match[i])
		{
			cout<<Match[i]<<' '<<i<<endl; 
		}
	}
	return 0;
}
posted @ 2020-08-16 13:49  Bushuai_Tang  阅读(126)  评论(2编辑  收藏  举报