網路流24題 騎士共存

2022-05-03 10:18:27 字數 1425 閱讀 2141

★★☆   輸入檔案:knight.in輸出檔案:knight.out簡單對比

時間限制:1 s   記憶體限制:128 mb

騎士共存問題

«問題描述:

在乙個n*n個方格的西洋棋棋盤上,馬(騎士)可以攻擊的棋盤方格如圖所示。棋盤

上某些方格設定了障礙,騎士不得進入。

«程式設計任務:

對於給定的n*n個方格的西洋棋棋盤和障礙標誌,計算棋盤上最多可以放置多少個騎

士,使得它們彼此互不攻擊。

«資料輸入:

由檔案knight.in給出輸入資料。第一行有2 個正整數n 和m (1<=n<=200, 0<=m<=n*n)

分別表示棋盤的大小和障礙數。接下來的m 行給出障礙的位置。每行2 個正整數,表示障

礙的方格座標。

«結果輸出:

將計算出的共存騎士數輸出到檔案knight.out。

輸入檔案示例 輸出檔案示例

knight.in

3 21 1

3 3knight.out

5【題解】:

首先把棋盤黑白染色,使相鄰格仔顏色不同。把所有可用的黑色格仔看做二分圖x集合中頂點,可用的白色格仔看做y集合頂點。從s向x集合中每個點連線一條容量為1的有向邊,從y集合中每個點向t連線一條容量為1的有向邊。從每個可用的黑色格仔向騎士一步能攻擊到的可用的白色格仔連線一條容量為無窮大的有向邊。求最小割,結果就是可用格仔的數量減去最小割。

【**】:

#include#include

using

namespace

std;

const

int dx=;

const

int dy=;

const

int n=210

;const

int m=n*n;

const

int inf=0x3f3f3f3f

;int n,m,s,t,num,id[n][n],mp[n][n],head[m],dis[m],q[m*5

];struct

nodee[m*10];int tot=1

;void add(int x,int y,int

z)bool

bfs()}}

return dis[t]

}int dfs(int x,int

f) }

dis[x]=0;//

tle*2

return

used;

}int

dinic()

void

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

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

}else}}

}int

main()

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