題目描述
給定乙個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 每個學...