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

2022-03-01 14:50:35 字數 1217 閱讀 1446

傳送門

de了兩個小時的bug愣是沒發現錯在**……沒辦法只好重打了一遍竟然1a……我有點想從這裡跳下去了……

和方格取數問題差不多,把格仔按行數和列數之和的奇偶性分為黑的和白的,可以發現某種顏色一定只能走到另一種顏色。那麼考慮對所有為奇的黑點,偶的為白點,源點對所有黑點連邊,所有白點對匯點連邊,容量都為$1$,然後黑點對所有能走到的白點連邊,容量為$inf$,那麼不難發現,要滿足條件就要求出一組割,而因為答案是全部的減去割,所以只要求出最小割即可

1

//minamoto

2 #include3 #include4 #include5 #include6

#define inf 0x3f3f3f3f

7using

namespace

std;

8#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?eof:*p1++)

9char buf[1

<<21],*p1=buf,*p2=buf;

10 inline int

read()

20const

int n=100005,m=500005;21

int dx=,dy=;

22int head[n],next[m],ver[m],edge[m],cur[n],dep[n],tot=1;23

int n,m,s,t,is[505][505

],ans;

24 queueq;

25 inline void add(int u,int v,int

e)29

bool

bfs()42}

43}44return

false;45

}46int dfs(int u,int

limit)56}

57return

flow;58}

59int

dinic()

64int

main()

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

72for(int j=1;j<=n;++j)82}

83else add(id,t,1

);84

}85 printf("

%d\n

",ans-dinic());

86return0;

87 }

洛谷 P3355 騎士共存問題

給出一張邊長為n,有幾個障礙點的棋盤,問最多可以放幾個騎士使他們不互相攻擊.我們可以反過來考慮,先將棋盤放滿騎士,計算至少去掉幾個騎士.經過觀察,我們可以發現,相同顏色的格仔上的棋子無法相互攻擊,因此可以讓超級源點連想每乙個紅點,每乙個黃點連向超級匯點,流量均為一,表示將棋盤放滿,再將紅格仔向可以攻...

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輸出格式 將計算出...