給乙個n×m
≤1e5
n×m\leq1e5
n×m≤1e
5的棋盤,然後每個棋盤都可以放乙個守衛,你可以選擇是讓它保護橫向的也可以讓他保護縱向的。然後乙個位置最多只能放乙個守衛,放置在(i,
j)
(i,j)
(i,j
)這個位置的代價是wi,
jw_
wi,j
。然後求使得所有的位置都被守護的最小代價。
完全不太會做的題。
一種費用流/最大權匹配的做法是左邊放n+m
n+mn+
m個點分別表示行/列,右邊是所有的座標,中間連代價大小的邊,求最大權匹配。
但複雜度會比較大,這裡的做法是把i
ii和j
jj連wi,
jw_
wi,j
大小的邊。然後求乙個基環樹,因為相當於每個點都要被選到,並且入度為111。
求基環樹用克魯斯卡爾維護。
如果當前兩個點在同一集合,那麼判斷是否已經成環,如果不成環還可以加上這一條邊。
如果當前兩個點不在同乙個集合,那麼判斷是否存在乙個點所在集合沒有成環,如果是可以加邊。
#include
using
namespace std;
typedef
long
long ll;
const
int inf=
0x3f3f3f3f
;const
int n=
2e5+7;
struct edge
}e[n]
;bool cir[n]
;int fa[n]
;int tot=0;
intfind
(int x)
intmain()
}sort
(e+1
,e+1
+tot)
; ll ans=0;
for(
int i=
1;i<=n+m;i++
) fa[i]
=i;for
(int i=
1;i<=tot;i++)}
elseif(
!cir[u]
||!cir[v])}
printf
("%lld\n"
,ans)
;return0;
}
BZOJ4883 棋盤上的守衛(最小生成樹)
bzoj 首先 n 行 m 列的棋盤顯然把行列拆開考慮,即構成了乙個 n m 個點的圖。我們把格仔看成邊,那麼點 x,y 看成 x 與 y 的一條邊,方向自己隨便定。那麼我們的任務就是選擇一些邊,使得所有點的入度至少為 1 既然要最小則顯然為恰好為 1 那麼我們現在有 n m 條邊,n m 個點,要...
棋盤上的守衛
在乙個n m的棋盤上要放置若干個守衛。對於n行來說,每行必須恰好放置乙個橫向守衛 同理對於m列來說,每列 必須恰好放置乙個縱向守衛。每個位置放置守衛的代價是不一樣的,且每個位置最多只能放置乙個守衛,乙個守衛 不能同時兼顧行列的防禦。請計算控制整個棋盤的最小代價。input 第一行包含兩個正整數n,m...
棋盤上的距離
描述 西洋棋的棋盤是黑白相間的8 8的方格,棋子放在格仔中間。如下圖所示 王 後 車 象的走子規則如下 寫乙個程式,給定起始位置和目標位置,計算王 後 車 象從起始位置走到目標位置所需的最少步數。輸入第一行是測試資料的組數t 0 t 20 以下每行是一組測試資料,每組包括棋盤上的兩個位置,第乙個是起...