bzoj4930 棋盤 費用流

2022-05-20 10:57:42 字數 1956 閱讀 6513

題目描述

給定乙個n×n的棋盤,棋盤上每個位置要麼為空要麼為障礙。定義棋盤上兩個位置(x,y),(u,v)能互相攻擊當前僅

當滿足以下兩個條件:

1:x=u或y=v

2:對於(x,y)與(u,v)之間的所有位置,均不是障礙。

現在有q個詢問,每個詢問給定ki,要求從棋盤中選出ki個空位置來放棋子,問最少互相能攻擊到的棋子對數是多少?

輸入第一行乙個整數n。

接下來輸入乙個n×n的字元矩陣,乙個位置若為.,則表示這是乙個空位置,若為#,則為障礙。

第n+2行輸入乙個整數q代表詢問個數。

接下來q行,每行乙個整數k,代表要放的棋子個數。

n ≤ 50, q ≤ 10000, k ≤ 棋盤中空位置數量

輸出輸出共q行,每行代表對應詢問的最少的互相能攻擊到的棋子對數。

樣例輸入

4..#.

####

..#.

..#. 17

樣例輸出2題解

費用流, bzoj4554 的強化版

按照那道題的思路,把相互影響的行和列的部分拿出來,同乙個點的行部分和列部分之間連邊。

不過這道題是固定棋子數,問最小的影響的棋子對數。

考慮,乙個行或列的部分,如果存在k個棋子,那麼相互影響的棋子對數為$\frac2$對(兩個棋子之間隔著其它棋子也算相互影響)。

所以我們可以使用拆邊法來解決,從s到行的部分、從列的部分到t連d條邊,其中d為該部分的位置數。第i條邊的費用為$\frac2-\frac2=i-1$。

然後跑費用流。在此過程中,由於每條增廣路的容量必定為1,所以相當於每次多放置了乙個棋子。這樣我們可以只跑一次ek費用流即可預處理出所有答案,然後再$o(1)$回答。

時間有點長但可以過,可以動態加邊來提高效率(這裡懶了沒有寫)

#include #include #include #define n 6010

#define m 1200010

#define inf 0x3f3f3f3f

using namespace std;

queueq;

int map[60][60] , bx[60][60] , tx , by[60][60] , ty , sx[n] , sy[n] , head[n] , to[m] , val[m] , cost[m] , next[m] , cnt = 1 , s , t , dis[n] , from[n] , pre[n] , ans[n];

char str[60];

void add(int x , int y , int v , int c)

bool spfa()

return ~from[t];

}void mincost()

}int main()

for(i = 1 ; i <= n ; i ++ )

for(j = 1 ; j <= n ; j ++ )

s = 0 , t = tx + ty + 1;

for(i = 1 ; i <= tx ; i ++ )

for(j = 0 ; j < sx[i] ; j ++ )

add(s , i , 1 , j);

for(i = 1 ; i <= ty ; i ++ )

for(j = 0 ; j < sy[i] ; j ++ )

add(i + tx , t , 1 , j);

for(i = 1 ; i <= n ; i ++ )

for(j = 1 ; j <= n ; j ++ )

if(!map[i][j])

add(bx[i][j] , by[i][j] + tx , 1 , 0);

mincost();

scanf("%d" , &q);

while(q -- ) scanf("%d" , &x) , printf("%d\n" , ans[x]);

return 0;

}

BZOJ4930 棋盤 拆邊費用流

給定乙個n n的棋盤,棋盤上每個位置要麼為空要麼為障礙。定義棋盤上兩個位置 x,y u,v 能互相攻擊當前僅 當滿足以下兩個條件 1 x u或y v 2 對於 x,y 與 u,v 之間的所有位置,均不是障礙。現在有q個詢問,每個詢問給定ki,要求從棋盤中選出ki個空位置來放棋子,問最少互相能攻擊到的...

bzoj1834(網路流 費用流)

給定一張有向圖,每條邊都有乙個容量c和乙個擴容費用w。這裡擴容費用是指將容量擴大1所需的費用。求 1 在不擴容的情況下,1到n的最大流 2 將1到n的最大流增加k所需的最小擴容費用。第一問裸的網路流 第二問 新建乙個匯點,將n號點與匯點相連,容量為k,限制最多增大的流量 費用為0 將原先每一條邊都新...

BZOJ 3442 學習小組 費用流

題目大意 給出學生的數目和學習小組的數目,學生參加小組需要交納費用,每個小組會支出c i cnt i 2。每個學生可以參加k個小組,問最多的學生參加時,最小支出費用。思路 如果不算後面那個什麼鬼的條件的話,見圖十分顯然。s 每個學生 f k,c 0 每個學生 每個學習小組 f 1,c f i 每個學...