poj 3057(bfs 二分匹配)

2021-09-26 06:16:34 字數 1146 閱讀 5505

題目大概意思是有一塊區域組成的房間,房間的邊緣有門和牆壁,『x』代表牆壁,『d』代表門,房間內部的『 . 』代表空區域,每個空區域站乙個人,人可以向上下左右走,每走一步花費一秒鐘,現在房間**了,所有人向四周的門逃生,但是每秒鐘一扇門只能通過乙個人,每個人移動到門時,就算逃脫,問在選取使得所有人最優的逃生方案時,最後乙個逃生的人花費多長時間?如果有人無法逃生,輸出impossible.

題目建圖思路比較難想。考慮到任意 t 時刻,每個門只能有乙個人逃生,那麼第ni個人可以在 ti 時間從 di號門逃生,這樣就構成了乙個二元組,兩個集合分別為n個人和(ti時間時,di號門逃生),計算出n個人組合的點集和(ti,di)組成的二分圖的匹配數,就可以判斷所有人是否可以逃生,匹配數 = n時則可以逃生。在跑匈牙利演算法時,當匹配數 = n,就是最後乙個人逃生,其花費的時間即為答案。依次遍歷區域,map[x][y] == 'd' 時候,利用一下bfs遞推出各個點上的人到這扇門di的最小距離,但是建這個點上的人到這扇門的邊集時,是要從其最短距離到最大距離建邊,因為每個人不一定是要走最短的路去這個門或是其他門逃生(每扇門每秒鐘只能通過一人)。其中要開乙個四維陣列dist[x][y][k][w](x,y表示門座標,k,w表示人座標) 儲存在點[k][w]的人到點[x][y]門的最小距離。

ac**:

#include#include#include#include#includeusing namespace std;

const int dx[4] = ,dy[4] = ;

vectormap;

vectordi,dj;//門的座標

vectorpi,pj;//人的座標

int x,y;

int dist[15][15][15][15]; //dist[i][j][k][w]表示位於座標(k,w)的人 到 (i,j)門的最短距離

int visit[150];//訪問陣列

bool g[7000][150];//建立二分圖

int match[150];//每個人的匹配陣列

void bfs(int a,int b)

for(int i = 0;i= 0)}}

} if(pi.size() == 0)

hungary();

} return 0;

}

poj 3343 二分匹配 二分

題意 n個人類星球和m個外星人星球,每個星球 包括外星人的 都有乙個初始的飛船數sh1 i 還有乙個每年生產的飛船數p i 還有乙個n m的矩陣d,d i,j 表示從人類星球i到外星人星球j的年數 年啊 當乙個人類星球i可以擊敗乙個外星人星球j的唯一條件是在出發年數ye,ye d i,j p i s...

POJ2446 二分匹配

題意 給你乙個n m的格仔,問你能不能用1 2的格仔把他鋪滿,有的位置是不能被鋪的。思路 水題,直接把個相鄰的並且都是可以鋪的點連一條邊然後匹配一遍就行了,提醒乙個地方,就是輸入不能鋪的座標的時候是 先輸入列再輸入行。include include define n node 1500 define...

POJ3020 二分匹配

思路 說給自己 一開始想的是從1 h w標記整幅圖,建圖是星號和 建邊,肯定要去匹配 啊,所以空格一定不會去造,然後就理解成了最小點覆蓋,然而對於最小點覆蓋,對於 孤立點 也就是沒有連出去的邊 這樣就錯了。但是對於這個思路還是打完了,然後發現錯了。其實對於 正確 思路要先想想是嘛。正解 這題題意是乙...