P3355 騎士共存問題 最小割

2022-05-09 01:24:11 字數 1312 閱讀 9554

題意:nxn的棋盤 有m個壞點 求能在棋盤上放多少個馬不會互相攻擊

題解:這個題仔細想想居然和方格取數是一樣的!!!

每個馬他能攻擊到的地方的座標 (x+y)奇偶性不一樣 於是就黑白染色

s->黑 白->t

按條件連黑->白 跑最小割 = 最大流 

感性理解一下 就是先把所有的點都放上 得到最大的收益

然後刪掉一些點使得合法 刪掉乙個黑點 減去黑點的收益 和黑點相連的白點受到的束縛就減少了

如果s和t點能聯通的話 表示還有黑點和白點連通 問題就轉化為了最小割

#include using

namespace

std;

const

int inf = 0x3f3f3f3f

;int

n, m, s, t, cnt, maxflow;

int broke[205][205

];struct

node e[

400005

];int head[40005

];int cur[40005

];int dx = ;

int dy = ;

void addedge(int x, int y, int

va)

int dep[40005

];int inque[40005

];bool

bfs() }}

}if(dep[t] != inf) return

true

;

return

false;}

intvis;

int dfs(int x, int

flow)

int used = 0

;

int rflow = 0

;

for(int i = cur[x]; i; i =e[i].nex) }}

return

used;

}void

dinic()

}}int id(int x, int

y) bool check(int x, int

y) int

main()

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

} else addedge(ii, t, 1

); }

}dinic();

printf(

"%d\n

", n * n - m -maxflow);

return0;

}

view code

洛谷P3355 騎士共存問題(最小割)

傳送門 de了兩個小時的bug愣是沒發現錯在 沒辦法只好重打了一遍竟然1a 我有點想從這裡跳下去了 和方格取數問題差不多,把格仔按行數和列數之和的奇偶性分為黑的和白的,可以發現某種顏色一定只能走到另一種顏色。那麼考慮對所有為奇的黑點,偶的為白點,源點對所有黑點連邊,所有白點對匯點連邊,容量都為 1 ...

P3355 騎士共存問題

題目描述 在乙個 n n個方格的西洋棋棋盤上,馬 騎士 可以攻擊的棋盤方格如圖所示。棋盤上某些方格設定了障礙,騎士不得進入 對於給定的 n n 個方格的西洋棋棋盤和障礙標誌,計算棋盤上最多可以放置多少個騎士,使得它們彼此互不攻擊 輸入格式 第一行有 2 個正整數n 和 m 1 n 200,0 m輸出...

P3355 騎士共存問題

在乙個n n個方格的西洋棋棋盤上,馬 騎士 可以攻擊的棋盤方格如圖所示。棋盤上某些方格設定了障礙,騎士不得進入 對於給定的n n 個方格的西洋棋棋盤和障礙標誌,計算棋盤上最多可以放置多少個騎士,使得它們彼此互不攻擊 輸入格式 第一行有 2 個正整數n 和 m 1 n 200,0 m輸出格式 將計算出...