BZOJ4883 棋盤上的守衛 最小基環樹

2021-09-29 13:34:33 字數 1226 閱讀 9837

給乙個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 以下每行是一組測試資料,每組包括棋盤上的兩個位置,第乙個是起...