BZOJ4883 棋盤上的守衛(最小生成樹)

2022-03-20 04:08:20 字數 774 閱讀 6980

bzoj

首先\(n\)行\(m\)列的棋盤顯然把行列拆開考慮,即構成了乙個\(n+m\)個點的圖。我們把格仔看成邊,那麼點\((x,y)\),看成\(x\)與\(y\)的一條邊,方向自己隨便定。那麼我們的任務就是選擇一些邊,使得所有點的入度至少為\(1\),既然要最小則顯然為恰好為\(1\)。那麼我們現在有\(n*m\)條邊,\(n+m\)個點,要構建乙個\(n+m\)個點的圖,顯然這個玩意是乙個基環森林,類似克魯斯卡爾一樣的維護一下即可。

#include#include#includeusing namespace std;

#define max 100100

#define ll long long

inline int read()

ll ans;

int n,m,tot,f[max];

bool cir[max];

struct edgee[max];

bool operator<(edge a,edge b)

int id(int i,int j)

int getf(int x)

int main()

; sort(&e[1],&e[tot+1]);

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

else if(!cir[u]||!cir[v])

f[u]=v,ans+=e[i].w,cir[v]|=cir[u];

} printf("%lld\n",ans);return 0;

}

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

給乙個n m 1e5 n m leq1e5 n m 1e 5的棋盤,然後每個棋盤都可以放乙個守衛,你可以選擇是讓它保護橫向的也可以讓他保護縱向的。然後乙個位置最多只能放乙個守衛,放置在 i,j i,j i,j 這個位置的代價是wi,jw wi,j 然後求使得所有的位置都被守護的最小代價。完全不太會做...

棋盤上的守衛

在乙個n m的棋盤上要放置若干個守衛。對於n行來說,每行必須恰好放置乙個橫向守衛 同理對於m列來說,每列 必須恰好放置乙個縱向守衛。每個位置放置守衛的代價是不一樣的,且每個位置最多只能放置乙個守衛,乙個守衛 不能同時兼顧行列的防禦。請計算控制整個棋盤的最小代價。input 第一行包含兩個正整數n,m...

棋盤上的距離

描述 西洋棋的棋盤是黑白相間的8 8的方格,棋子放在格仔中間。如下圖所示 王 後 車 象的走子規則如下 寫乙個程式,給定起始位置和目標位置,計算王 後 車 象從起始位置走到目標位置所需的最少步數。輸入第一行是測試資料的組數t 0 t 20 以下每行是一組測試資料,每組包括棋盤上的兩個位置,第乙個是起...