1. 程式人生 > >「網絡流24題」1. 飛行員配對方案問題

「網絡流24題」1. 飛行員配對方案問題

while pan 配對 problem http 沒有 鏈接 mem 方案

「網絡流24題」1. 飛行員配對方案問題

<題目鏈接>


比較經典的一道二分圖最大匹配。

匈牙利算法走起啊。

算出答案後,輸出每個外籍飛行員匹配的點(如果有)即可。

匈牙利算法,簡而言之就是,每個x部點u去找自己能匹配上的第一個y部點v,如果v還沒有被匹配,或是v已經匹配的x部點w還能匹配其他y部點)就將x與y匹配。

「如果我除了她(v)還能追到別的妹子,我就把她讓給你。」——w對x如是說。

代碼簡明易懂。

#include <cstdio>
#include <cstring>
const int MAXN=110;
bool vis[MAXN],e[MAXN][MAXN];
int
m,n,x,y,ans,cx[MAXN],cy[MAXN]; bool DFS(int i) { for(int j=m+1;j<=n;++j) if(e[i][j] && !vis[j]) { vis[j]=1; if(!cy[j] || DFS(cy[j])) { cx[i]=j,cy[j]=i; return 1; } } return 0; } void
Hungary(void) { for(int i=1;i<=m;++i) if(!cx[i]) { memset(vis,0,sizeof vis); ans+=DFS(i); } } int main(int argc,char *argv[]) { scanf("%d %d",&m,&n); while(~scanf("%d %d",&x,&y) && ~x && ~y) e[x][y]=1
; Hungary(); if(!ans) { printf("No Solution!\n"); return 0; } printf("%d\n",ans); for(int i=1;i<=m;++i) if(cx[i]) printf("%d %d\n",i,cx[i]); return 0; }

謝謝閱讀。

「網絡流24題」1. 飛行員配對方案問題