題意:nxn的棋盤 有m個壞點 求能在棋盤上放多少個馬不會互相攻擊
題解:這個題仔細想想居然和方格取數是一樣的!!!
每個馬他能攻擊到的地方的座標 (x+y)奇偶性不一樣 於是就黑白染色
s->黑 白->t
按條件連黑->白 跑最小割 = 最大流
感性理解一下 就是先把所有的點都放上 得到最大的收益
然後刪掉一些點使得合法 刪掉乙個黑點 減去黑點的收益 和黑點相連的白點受到的束縛就減少了
如果s和t點能聯通的話 表示還有黑點和白點連通 問題就轉化為了最小割
#include usingview codenamespace
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;
}
洛谷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輸出格式 將計算出...