53題意:
白點,黑點各有n個,每對黑白點之間連乙個線段,問在保證線段不相交的情況下,應該怎麼連,使其距離和最小(距離為歐幾里德距離)輸出每個白點所對應的黑點編號。
思路:很明顯是二分圖最小權值匹配問題,由於km演算法求的是最大權值匹配,故要將權值取負,然後用 \(km\) 模板即可,最後結果再取反輸出
對於km演算法,我還是處於懵懂狀態,需要繼續理解。
#include#include#include#includeusing namespace std;
const int n = 105;
int a[n], b[n], c[n], d[n];
double w[n][n]; // 邊權
double la[n], lb[n]; // 左、右部點的頂標
bool va[n], vb[n]; // 訪問標記:是否在交錯樹中
int match[n], ans[n]; // 右部點匹配了哪乙個左部點
int n;
double upd[n], delta;
bool dfs(int x)
}else upd[y] = min(upd[y], la[x] + lb[y] - w[x][y]);
return false;
}void km()
for (int i = 1; i <= n; i++)
while (true)
}}int main()
貼乙個形象生動講km演算法的部落格: POJ 3565 Ants(計算幾何,KM)
by cxlove 題目 給出一些螞蟻的點,給出一些樹的點,兩兩對應,使他們的連線不相交,輸出一種方案。可以任意假定一種組合,然後兩兩判斷,如果相交,則交換,直到全部不相交為止。這種思想很新穎,被稱為計算幾何中的調整思想。include include include include include...
poj 3308 最小點權覆蓋 最小割
思路 裸的最小點權覆蓋,建立超級源點和超級匯點,將源點與行相連,容量為這行消滅敵人的代價,將列與匯點相連,容量為這列消滅敵人的代價,對於每乙個敵人 x,y 連邊x y,容量為inf,這樣就說明選取的點覆蓋了那些邊 敵人 然後跑最大流求最小割即可。ps 這裡是乘積最小,要取對數轉化為和最小。1 inc...
poj 2125 最小點權覆蓋
題意描述 給你一張有向圖,每個點有兩個權值 w w w 表示刪掉該點的所有入邊所需要的花費,w 表示刪掉該點的所有出邊所需要的花費,問要刪除所有的點需要的最少花費為多少?分析 因為涉及到了點權和所有的邊那麼很容易想到最小點權覆蓋,但是這裡每個點有兩個權值怎麼處理呢?這樣建圖 將點拆成兩個點,每個點對...