1. 程式人生 > 實用技巧 >題解 洛谷P2756 網路流24題.04 【飛行員配對方案問題】

題解 洛谷P2756 網路流24題.04 【飛行員配對方案問題】

\(\huge\mathbb{DESCRIPTION}\)
編號:洛谷\(P2756\)\(LOJ6000\)(與洛谷上本題輸入和輸出格式都有不同)
演算法:網路最大流\(\mathbb{OR}\)深度優先搜尋
來源:網路流\(24\)
\(\huge\mathbb{SOLUTION}\)
誒,必須吐槽一句,為什麼我做網路流\(70\%\)以上都沒用網路流呢?
好吧,這道題目是一道較好的網路最大流的題目。
然後,我隨手寫了一個深度優先搜尋,俗稱\(Dfs\),大約\(30ms\)就跑過了。
首先,我們把所有的可以配對的飛行員都輸入進來。
然後,我們列舉每一名飛行員,搜尋是否有人還能和他匹配。
最後輸出一下即可。

這裡還要補充一件事情:

很多同學存圖喜歡用鏈式前向星
然而作者我並不喜歡,我認為\(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;
}