學術篇 網路流24題 騎士共存問題

2022-09-06 10:51:18 字數 1614 閱讀 1770

啥也不說,先上傳送門:luogu3355

顯然,騎士的步伐有很好的性質:如果我們為棋盤黑白染色,騎士每一步只會從黑格走到白格,或從白格走到黑格。

(這一點下過西洋棋的人都知道,沒下過的畫一畫也知道)

所以我們把棋盤黑白染色,依次標號,然後將障礙格去掉(單獨處理)。我們建立源點s和匯點t,從s向所有黑格依次連容量為1的邊,從所有白格依次向t連容量為1的邊。然後,為避免重複,我們只將每個黑格向騎士能從此格一步走到的白格連容量為正無窮的邊,就建立起了乙個網路流圖。

下圖是以題目樣例為例,說明一下該如何建圖。

圖中也新增了很多的說明。。。

所以最後非障礙格中我們不能選的就是網路流圖中的最小割。。

那麼我們就能夠得到下面的式子:

最多放置騎士個數=棋盤上的格仔總數-障礙格數-最小割數
**也就應運而生了..

(我的**建邊方式非常玄學,大家最好不要向我學習。。。)

下面貼**(碼風輕噴..):

//ide:dev-c++ 5.7.1

//**並沒有經過vs加工

#include

#include

#include

using

std::queue;

#define gc getchar()

#define cl(a,b) memset(a,b,sizeof(a))

const

int maxv=0x9c44;

const

int maxe=0x186af

<<2;

const

int inf=~0u>>1;

const

int kx[8]=;

const

int ky[8]=;

struct edgee[maxe]; int v[maxv],tot=1;

int d[maxv],cur[maxv];

bool can[202][202];

int s,t;

inline

int gnum() //讀入優化

inline

int max(const

int &a,const

int &b)

inline

int min(const

int &a,const

int &b)

inline

void build(int x,int y,int z)

bool bfs()

}return d[t]>0;

}int dfs(int x,int mx)

}return s;

}int dinic()

int main()

}}//奇妙的建邊..轉化公式圖上好像有..

printf("%d",n*n-o-dinic());

}

反正就是這樣。。可能因為我玄學壓常跑的還挺快,刷進了第一頁。。

the end.

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