網路流24題24 騎士共存問題

2022-04-29 07:03:09 字數 1158 閱讀 7754

題面戳我

題目描述

在乙個 nn個方格的西洋棋棋盤上,馬(騎士)可以攻擊的棋盤方格如圖所示。棋盤上某些方格設定了障礙,騎士不得進入

對於給定的 nn 個方格的西洋棋棋盤和障礙標誌,計算棋盤上最多可以放置多少個騎士,使得它們彼此互不攻擊

輸入輸出格式

輸入格式:

第一行有 2 個正整數n 和 m (\(1<=n<=200, 0<=m),分別表示棋盤的大小和障礙數。接下來的 m 行給出障礙的位置。每行 2 個正整數,表示障礙的方格座標。

輸出格式:

將計算出的共存騎士數輸出

輸入輸出樣例

輸入樣例#1:

3 2

1 13 3

輸出樣例#1:

5
這題其實就是【網路流24題9】方格取數問題的弱化版。

還是最大獨立集=\(\sum\)點權-最小頂點覆蓋,然後二分圖最小頂點覆蓋=最小割=最大流

注意到這裡的最大流其實就是二分圖匹配數,然後你寫乙個匈牙利上去就會t,會t,t。。。

#include#include#include#includeusing namespace std;

#define inf 1000000000

const int _ = 205;

struct edgea[_*_*10];

int n,m,s,t,map[_][_],head[_*_],cnt=1,dep[_*_],cur[_*_],sum,ans;

int dx[8]=,dy[8]=;

queueq;

void link(int u,int v,int w)

; head[u]=cnt;

a[++cnt]=(edge);

head[v]=cnt;

}bool bfs()

return dep[t];

}int dfs(int u,int flow)

} return 0;

}int main()

}else link(n*i-n+j,t,1);

} while (bfs())

printf("%d\n",n*n-m-ans);

return 0;

}

網路流24題 騎士共存問題

click me 考慮建乙個二分圖 互相攻擊的點連邊,求最小覆蓋數 考慮將互相攻擊的點連一條流量為1的邊,然後求最小割 au hany01 date jan 9th,2018 prob luogu2756 email hany01 foxmail.com include include includ...

網路流24題 騎士共存問題

互不侵犯?這麼多種走位的方式,當然沒有辦法動態規劃啦!反正我不會 網路流可是解決規劃問題的大利器啊!有木有想到二分圖最大點權獨立集呢!黑白染色 向可以走到的地方連邊 跳過障礙物點 求最小割 做完啦!如下 include include include include include define m...

網路流24題 騎士共存問題

題面 傳送門思路 基本上和方格取數問題差不多 這道題可以證明,如果把每兩個不能共存的點連在一起,那麼這個圖沒有奇環,是乙個二分圖 同時,如果把這個影象西洋棋一樣黑白染色,那麼連邊的兩個點顏色不同 源點連黑點,邊權為1 黑點連白點,邊權為inf 白點連匯點,邊權為1 跑出最大流,即為這個圖的最小點覆蓋...