题解 洛谷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;
}
不要妄图追上西坠的太阳,而是要在黎明前就等着它!