LA 4043 最優匹配

2022-04-01 07:18:00 字數 1372 閱讀 3880

題意: n 個 白點,n 個黑點,給出了座標,求完美匹配後,各點不相交,輸出白點對於的黑點編號;(輸出輸錯了 (;´д`)ゞ)

分析:(a1-b1) (a2-b2)

如果這樣連線,那麼肯定大於 (a1-b2) (a2-b1);也就說,我們要的完美匹配要是權值最小的匹配;

這樣,我們的權值,可以全改為負數,這樣就可以轉為普通的km演算法了;

km演算法(我的理解):

可行標  lx(i) + ly(j)>=w(i,j),當完全子圖中的 所有lx(i) + ly(j) ==w(i,j) 時,就有,這個子圖是最大權匹配的完美匹配(最佳完美匹配);

怎麼得到可行標呢? 初始化話所有x是鄰接陣裡面最大的那一條,然後在匈牙利樹上找,不斷的擴充這個匈牙利樹,直到成為乙個完全子圖;

怎麼擴充匈牙利樹呢? 每次在s,t' 中找最小的乙個lx(x) + ly(y) -w(x,y),去修改原來的匈牙利樹,使得有可能有新的邊加進來;

1 #include 2

3using

namespace

std;

4#define esp 1e-10

5const

double inf =1e20;

6const

int maxn = 1000;7

intn;

8double

w[maxn][maxn];

9double

lx[maxn],ly[maxn];

10int

lefts[maxn];

11bool

s[maxn],t[maxn];

1213

14bool match(int

i) 24}25

}26return

false;27

}2829void

update() 39}

4041

void

km() 49}

5051

for(int i=1;i<=n;i++) 59}

60}6162

struct

point points[maxn];

6566

67int

main()

6882}83

84km();

8586

for(int i=1;i<=n;i++)

87 printf("

%d\n

",lefts[i]);

8889}90

return0;

91 }

view code

LA 3353 最優巴士線路設計

給出乙個 n 個點的有向圖,找若干個圈,是的每個結點恰好屬於乙個圈。要求總長度盡量小。三倍經驗題 uva 12264,hdu 1853 這題有兩種解法,一是匹配 每個點只在乙個圈中,則他有唯一的前驅和後繼,也就是入度為1,出度為1,拆成 入度點和出度點,跑最小全匹配,因為是匹配,這樣就保證了他在唯一...

UVALive 4043 轉化最佳完美匹配

首先黑點和白點是組成乙個二分圖這毫無疑問 關鍵是題目中要求的所有黑白配的線不能交叉。一開始我也沒想到這個怎麼轉化為二分圖裡面的演算法。後來看書才知道,如果兩兩交叉,則可以把兩根線當四邊形的對角線,連四邊形的兩條邊,則肯定不交叉,而且乙個很明顯的特徵是,不交叉的兩條線的他們的長度和 一定比交叉線的長度...

km演算法的非最優匹配應用

km演算法可以用來求最優匹配,但是,它本身蘊含著複雜的數學原理,我暫時還不知道怎麼理解,僅僅在此提一道非匹配應用。題目 爭奪 題目描述 小y和小p無聊的時候就喜歡玩遊戲,但是每次小p都輸給了小y。終於有一天,你看不過去了,決定幫小p一把。遊戲是這樣的,乙個n m的棋盤 保證n或m中,至少有乙個為偶數...