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

2022-03-27 06:53:31 字數 1339 閱讀 4280

乍一看與那個互不侵犯king很像,但這個資料範圍就只能網路流了

我們可以發現只有黑的能攻擊白的,白的能攻擊黑的。

所以黑白相當於乙個二分圖

最小點獨立集=總數-最小割(也就是說兩個點裡要至少留乙個)

最小割=最小點覆蓋=最大匹配

網路流建圖求最大匹配即可

同時在做這題的過程中我發現對於網路流求最大匹配如果你一開始就能明確二分圖的區分那麼你可以建s->i,i->i~->i~->j,j->j~,j~->t

如果你並不能將他們區分開那麼就要建s->i,i->j~,j~->t這種模型

1 #include2

using

namespace

std;

3const

int n=2005;4

int head[n*n*2],d[n*n*2

],ma[n][n];

5int n,m,cnt=-1

,s,t;

6struct

nodee[2000005];9

int xx[8]=;

10int yy[8]=;

11void add(int x,int y,int

w)12

16 queueq;

17bool bfs(int x,int

y)1830}

31return d[y]!=-1;32

}33int dfs(int x,int w,int

yy)34

45 e[i].w-=flow;e[i^1].w+=flow;s+=flow;

46if(s==w)return

s;47}48

return

s;49}50

intdinic()

5157

return

ans;58}

59int

main()

6073 s=0;t=n*n*2+1;int p=n*n;

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

75for(int j=(i%2)?1:2;j<=n;j+=2)76

86}87}

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

89for(int j=(i%2)?2:1;j<=n;j+=2)90

if(ma[i][j])

91 add(ma[i][j]+p,t,1

);92

int ans=dinic();

93 printf("

%d\n

",n*n-m-ans);

94return0;

95 }

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

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

網路流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...