題解 洛谷P2756 網路流24題.04 【飛行員配對方案問題】
阿新 • • 發佈:2020-08-16
\(\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; }