1. 程式人生 > >過山車 (二分圖最大匹配 匈牙利演算法)

過山車 (二分圖最大匹配 匈牙利演算法)

開始時比較難理解的演算法

原題過山車

題意:n個女生,m個男生,每個女生都有幾個固定的可以搭配的男生,有k組搭配總共,輸入a,b代表a女生可以和b男生搭配,問最後最多有幾對搭配。

附程式碼


int head_g[N];
int now_g;
int vis[N];//vis[a]==b  屬於a這個男人的女人為b 
int k,nugi,nubo;
int viss[N];//在同一個女生的fin函式群裡面,是否被訪問過 

struct node{
    int to,nex;
}e_g[4*N];

void add_g(int b,int g){
    e_g[++now_g].to=b;e_g[now_g].nex=head_g[g];head_g[g]=now_g;
}

int
fin(int g){ for(int i=head_g[g];~i;i=e_g[i].nex){ if(viss[e_g[i].to]==1)continue; viss[e_g[i].to]=1;//用來標識,對於一個同一個女生的一個流程,不會對訪問過的男生再次訪問避免死迴圈 if(vis[e_g[i].to]==0||fin(vis[e_g[i].to])){//沒找到女生或找到的女生可以換男人 vis[e_g[i].to]=g; return 1; } } return
0; } int main(){ while(scanf("%d",&k),k!=0){scanf("%d%d",&nugi,&nubo); mmm(head_g,-1);mmm(vis,0);now_g=0;mmm(viss,0); for1(i,1,k){ int a,b;scanf("%d%d",&a,&b); add_g(b,a); } int ans=0; for1(i,1,nugi){ mmm(viss,0
);//對於每個女生,都要清一遍 //開始的時候死活沒想到可以再設一個viss陣列每次都清一遍 //這樣既可以避免死迴圈,而且不用去除vis上儲存的男生已經配對的女生 if(fin(i)==1)ans++; } printf("%d\n",ans); } }

思路
就是對於每個女生,找一遍她可以配對的男生(鏈式前向星 存圖),有以下兩種情況即可成功配對:

  1. 找到一個還沒有和其他妹子配對的男生配對
  2. 找到一個已經配對的男生,他配對的那個妹子可以找到其他男生,change

因為不知道往回找幾次,所以需要用到遞迴,找到一個可change的配對,就停止,把這一系列的男女配對都change一遍,或是找到最後還是找不到,return 0,由for迴圈換下一個女生。

如果還是不明白,下面有我程式碼對於案例的流程:
這裡寫圖片描述

對於vis和viss,vis是全域性的,不受for迴圈影響的,用來存已經配對的女生,而viss就是一般的vis(我程式碼中的vis換成boy’s girl,viss換成vis可能更容易理解),每次for都要memset,代表在這次for中是否訪問過。

假設沒有vis,位置1上的是2,現在插入3,發現可以插入到1,代替2,2出來後又發現可以插入到1,替換3,就死迴圈了。

簡潔後差不多就是隻剩這個函數了

int match[209],vis[209];

int fin(int h){
    for(int i=0;i<=n;i++){//試圖找到一個可以插入的空
        if(vis[i]||link[h][i])continue;
        vis[i]=1;
        if(match[i]==0||fin(match[i])){
            match[i]=h;return 1;
        }
    }
    return 0;
}

相關推薦

二分匹配 匈牙利演算法

開始時比較難理解的演算法 原題:過山車 題意:n個女生,m個男生,每個女生都有幾個固定的可以搭配的男生,有k組搭配總共,輸入a,b代表a女生可以和b男生搭配,問最後最多有幾對搭配。 先附程式碼: int head_g[N]; int now_g;

HDU:2063 二分匹配

過山車 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 16791 Accepted Su

HDU2389:Rain on your Parade二分匹配+HK演算法

Rain on your Parade Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 655350/165535 K (Java/Others)Total Submission(s): 5755&nbs

[POJ2446] Chessboard二分匹配-匈牙利算法

con clas sed img find span ble names printf 傳送門 把所有非障礙的相鄰格子彼此連一條邊,然後求二分圖最大匹配,看 tot * 2 + k 是否等於 n * m 即可。 但是連邊不能重復,比如 a 格子 和 b 格子 相鄰

I - Strategic Game 二分匹配的性質

I - Strategic Game Bob enjoys playing computer games, especially strategic games, but sometimes he cannot find the solution fast enough and then he

匈牙利演算法二分匹配演算法

匈牙利演算法是由匈牙利數學家Edmonds於1965年提出,因而得名。匈牙利演算法是基於Hall定理中充分性證明的思想,它是二部圖匹配最常見的演算法,該演算法的核心就是尋找增廣路徑,它是一種用增廣路徑求二分圖最大匹配的演算法。 設 G=(V,E) 是一個無向

通俗易懂小白入門二分匹配——匈牙利演算法

二分圖  先介紹一下什麼是二分圖,二分圖也叫二部圖,設G=(V,E)是一個無向圖,如果頂點V可分割為兩個互不相交的子集(A,B),並且圖中的每條邊(i,j)所關聯的兩個頂點i和j分別屬於這兩個不同的頂點集(i in A,j in B),則稱圖G為一個二分圖,如下圖所有的頂點可以分成A,B兩個集合,而

二分匹配 匈牙利演算法的簡單理解

(本文圖片及被*標註內容來自CSDN部落格:pi9nc) 基本概念—二分圖 二分圖:是圖論中的一種特殊模型。若能將無向圖G=(V,E)的頂點V劃分為兩個交集為空的頂點集,並且任意邊的兩個端點都分屬於兩個集合,則稱圖G為一個為二分圖。 匹配:一個匹配即一個包含若干條邊的集合,且其中任

二分,求大增廣路徑

【書本上的演算法往往講得非常複雜,我和我的朋友計劃用一些簡單通俗的例子來描述演算法的流程】 匈牙利演算法是由匈牙利數學家Edmonds於1965年提出,因而得名。匈牙利演算法是基於Hall定理中充分性證明的思想,它是部圖匹配最常見的演算法,該演算法的核心就是尋找增廣路徑,

hdu-2063 二分

sstream inpu 二分圖 urn 一行 問題 partner str stream Time limit1000 ms Memory limit32768 kB RPG girls今天和大家一起去遊樂場玩,終於可以坐上夢寐以求的過山車了。可是,過山車的每一排只有

HDU 2063 二分裸題

題意: 中文題,就是問你最大匹配有多少 這個才不是連結呢 下面直接程式碼吧,這個直接套模板就好= =; /*鏈式前向星*/ #include<iostream> #include<string> #include<

2063 二分匹配

題目連結: 題解: 二分圖匹配模板題。 AC程式碼: #include <iostream> #include <algorithm> #include

HDU 2063 二分

過山車 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi

POJ 2771 Guardian of Decency 二分點獨立集

str number iostream hit school ear one ability clas Guardian of Decency Time Limit: 3000MS Memory Limit: 65536K Total S

【BZOJ1059】矩陣遊戲二分匹配

set 交換 tdi namespace 顏色 pac 連線 include amp 題意:矩陣遊戲在一個N*N黑白方陣進行。每次可以對該矩陣進行兩種操作: 行交換操作:選擇矩陣的任意兩行,交換這兩行(即交換對應格子的顏色) 列交換操作:選擇矩陣的任意行列,交換這兩列(即交

jzojP2071 座位安排二分匹配

P2071 座位安排 題目背景 公元二零一四年四月十七日,小明參加了省賽,在一路上,他遇到了許多問題,請你幫他解決。 題目描述 已知車上有N排座位,有N*2個人參加省賽,每排座位只能坐兩人,且每個人都有自己想坐的排數,問最多使多少人坐到自己想坐的位置。 輸入輸出格式 輸入格式

洛谷P1894 [USACO4.2]完美的牛欄The Perfect Stall二分匹配

P1894 [USACO4.2]完美的牛欄The Perfect Stall 題目描述 農夫約翰上個星期剛剛建好了他的新牛棚,他使用了最新的擠奶技術。不幸的是,由於工程問題,每個牛欄都不一樣。第一個星期,農夫約翰隨便地讓奶牛們進入牛欄,但是問題很快地顯露出來:每頭奶牛都只願意在她們喜

HDU4185:Oil Skimming二分匹配

Oil Skimming Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3903  &

3041 Asteroids二分匹配

題意 在一個N×NN×N的網格上,分佈著KK個行星。 Bessie擁有一種能力,每次可以消滅一行或一列的行星。 求Bessie最少需要多少次才可以消滅所有的行星。 輸入 輸入N,KN,K。 接下來KK行,每行輸入2個整數x,yx,y,表示一個行星

二分匹配51NOD 2006 飛行員配對

第二次世界大戰時期,英國皇家空軍從淪陷國徵募了大量外籍飛行員。由皇家空軍派出的每一架飛機都需要配備在航行技能和語言上能互相配合的2名飛行員,其中1名是英國飛行員,另1名是外籍飛行員。在眾多的飛行員中,每一名外籍飛行員都可以與其他若干名英國飛行員很好地配合。如何選擇配對飛行的