騎士共存問題(網路流24題之一)

2021-08-21 21:13:10 字數 1149 閱讀 2471

題目

題目描述

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

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

輸入輸出格式

輸入格式:

第一行有 2 個正整數n 和 m (1<=n<=200, 0<=m輸出格式:

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

思路分析:這一題……也沒啥好講的了,都把圖畫了出來色都染了,還有什麼意思……不過還是要講講di

首先,我們按照顏色把圖分成兩部分,然後把互相攻擊的連邊,跑一遍最大流,然後用總的點數 - 障礙物的數量 - 最大流就是最終的答案。。

講的有點草率,如果還是不理解的話可以看看這篇blog講得比較詳細。

**:

#includeusing namespace std;

const int inf=0x3f3f3f3f;

const int maxn=1000005;

const int maxm=1000005;

int d[maxn],n,m,p[maxn],eid,s,t,x,y;

struct ae[maxm];

void init()

void add(int u,int v,int c)

void insert(int u,int v,int c)

int bfs()

} }return (d[t]!=-1);

}int dfs(int u,int flow)

} if(!ret) d[u]=-1;

return ret;

}int dinic()

return ret;

} //以上部分是標準的dinic,這裡就不多講

int a[maxn];

int main ()

for(int i=1;i<=n*n;i++)if(!a[i])

else

insert(i,t,1);

} printf("%d",n*n-dinic()-m);//大家可以想想為蛤輸出這個。。(相信大家都會的)

return 0;

}

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