在乙個n\(*\)n個方格的西洋棋棋盤上,馬(騎士)可以攻擊的棋盤方格如圖所示。棋盤上某些方格設定了障礙,騎士不得進入!
對於給定的n\(*\)n 個方格的西洋棋棋盤和障礙標誌,計算棋盤上最多可以放置多少個騎士,使得它們彼此互不攻擊
輸入格式:
第一行有 2 個正整數n 和 m (1<=n<=200, 0<=m輸出格式:
將計算出的共存騎士數輸出
二分圖的最大獨立集問題,因為黃點只能攻擊黃點,而紅點只能攻擊紅點
我們先考慮黑白染色
將(i+j)&1即黃色染黑,其餘點染白。因為我們能相互攻擊的點一定是在二分圖兩側,然後能攻擊的點連邊跑最大流就好了
#include#define inf 0x3f3f3f3f
using namespace std;
const int maxn=400+10,maxm=1000000+100;
int head[maxn*maxn],dis[maxn*maxn],mark[maxn][maxn],vis[maxn*maxn];
int cur[maxn*maxn];
int s,t,n,m,size=1;
int dx=,dy=;
struct edge
e[maxm];
void addedge(int u,int v,int val)
inline int read()
while(ch<='9'&&ch>='0')
return x*f;
}int id(int i,int j)
bool bfs(int s)
} }return dis[t];
}int dinic(int u,int f)
} }return 0;
}int maxflow()
} return flow;
}int main()
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
}else addedge(u,t,1);
}printf("%d",n*n-m-maxflow());
return 0;
}
P3355 騎士共存問題
題目描述 在乙個 n n個方格的西洋棋棋盤上,馬 騎士 可以攻擊的棋盤方格如圖所示。棋盤上某些方格設定了障礙,騎士不得進入 對於給定的 n n 個方格的西洋棋棋盤和障礙標誌,計算棋盤上最多可以放置多少個騎士,使得它們彼此互不攻擊 輸入格式 第一行有 2 個正整數n 和 m 1 n 200,0 m輸出...
洛谷 P3355 騎士共存問題
給出一張邊長為n,有幾個障礙點的棋盤,問最多可以放幾個騎士使他們不互相攻擊.我們可以反過來考慮,先將棋盤放滿騎士,計算至少去掉幾個騎士.經過觀察,我們可以發現,相同顏色的格仔上的棋子無法相互攻擊,因此可以讓超級源點連想每乙個紅點,每乙個黃點連向超級匯點,流量均為一,表示將棋盤放滿,再將紅格仔向可以攻...
P3355 騎士共存問題 網路流
在乙個 n n個方格的西洋棋棋盤上,馬 騎士 可以攻擊的棋盤方格如圖所示。棋盤上某些方格設定了障礙,騎士不得進入 對於給定的 n n 個方格的西洋棋棋盤和障礙標誌,計算棋盤上最多可以放置多少個騎士,使得它們彼此互不攻擊 和方格取數一模一樣 只不過相鄰改成了日字 所有的權值都為1 主要要減去m個障礙 ...