題意: 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 2view code3using
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 }
LA 3353 最優巴士線路設計
給出乙個 n 個點的有向圖,找若干個圈,是的每個結點恰好屬於乙個圈。要求總長度盡量小。三倍經驗題 uva 12264,hdu 1853 這題有兩種解法,一是匹配 每個點只在乙個圈中,則他有唯一的前驅和後繼,也就是入度為1,出度為1,拆成 入度點和出度點,跑最小全匹配,因為是匹配,這樣就保證了他在唯一...
UVALive 4043 轉化最佳完美匹配
首先黑點和白點是組成乙個二分圖這毫無疑問 關鍵是題目中要求的所有黑白配的線不能交叉。一開始我也沒想到這個怎麼轉化為二分圖裡面的演算法。後來看書才知道,如果兩兩交叉,則可以把兩根線當四邊形的對角線,連四邊形的兩條邊,則肯定不交叉,而且乙個很明顯的特徵是,不交叉的兩條線的他們的長度和 一定比交叉線的長度...
km演算法的非最優匹配應用
km演算法可以用來求最優匹配,但是,它本身蘊含著複雜的數學原理,我暫時還不知道怎麼理解,僅僅在此提一道非匹配應用。題目 爭奪 題目描述 小y和小p無聊的時候就喜歡玩遊戲,但是每次小p都輸給了小y。終於有一天,你看不過去了,決定幫小p一把。遊戲是這樣的,乙個n m的棋盤 保證n或m中,至少有乙個為偶數...