在乙個 n*n個方格的西洋棋棋盤上,馬(騎士)可以攻擊的棋盤方格如圖所示。棋盤上某些方格設定了障礙,騎士不得進入
對於給定的 n*n 個方格的西洋棋棋盤和障礙標誌,計算棋盤上最多可以放置多少個騎士,使得它們彼此互不攻擊
和方格取數一模一樣
只不過相鄰改成了日字 所有的權值都為1
主要要減去m個障礙
#includeusingview codenamespace
std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define ri(n) scanf("%d",&(n))
#define rii(n,m) scanf("%d%d",&n,&m)
#define riii(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define rs(s) scanf("%s",s);
#define ll long long
#define pb push_back
#define rep(i,n) for(int i=0;i
#define clr(a,v) memset(a,v,sizeof a)
/////////////////////////////////
/#define inf 0x3f3f3f3f
const
int n=4e5+44
; const
int m=4e6+54
;struct
edge e[m
<< 1
];int head[n], cnt = 1
;void add(int x, int y, int
z) ;
head[x] =cnt;
e[++cnt] = (edge);
head[y] =cnt;
}int
level[n];
bool bfs(int s, int
t) }
return
level[t];
}int dfs(int s, int t, int
flow)
}if (!ret) level[s] = 0
;
return
ret;
}int dinic(int s, int
t) int
n,m,s,t;
int id(int x,int
y)int mp[205][205
];int dx=;
int dy=;
intmain()
rep(i,
1,n)
rep(j,
1,n)
if(!mp[i][j])}}
else add(id(i,j),t,1
); }
cout
}
也可以用二分圖匹配來做 但是 會t一些點 (只是介紹思路)
求的是最大獨立集團點數 = n - 最大匹配數!
#include usingview codenamespace
std;
const
int n = 206
;const
int dx[8] = ;
const
int dy[8] = ;
int n, m, ans, f[n][n][2
];bool
a[n][n], v[n][n];
inline
bool dfs(int x, int
y) }
return0;
}int
main()
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
cout
<< n * n - m - ans <
return0;
}
P3355 騎士共存問題 網路流
在乙個 n n個方格的西洋棋棋盤上,馬 騎士 可以攻擊的棋盤方格如圖所示。棋盤上某些方格設定了障礙,騎士不得進入 對於給定的 n n 個方格的西洋棋棋盤和障礙標誌,計算棋盤上最多可以放置多少個騎士,使得它們彼此互不攻擊 輸入格式 第一行有 2 個正整數n 和 m 1 n 200,0 m 輸出格式 將...
P3355 騎士共存問題
題目描述 在乙個 n n個方格的西洋棋棋盤上,馬 騎士 可以攻擊的棋盤方格如圖所示。棋盤上某些方格設定了障礙,騎士不得進入 對於給定的 n n 個方格的西洋棋棋盤和障礙標誌,計算棋盤上最多可以放置多少個騎士,使得它們彼此互不攻擊 輸入格式 第一行有 2 個正整數n 和 m 1 n 200,0 m輸出...
P3355 騎士共存問題
在乙個n n個方格的西洋棋棋盤上,馬 騎士 可以攻擊的棋盤方格如圖所示。棋盤上某些方格設定了障礙,騎士不得進入 對於給定的n n 個方格的西洋棋棋盤和障礙標誌,計算棋盤上最多可以放置多少個騎士,使得它們彼此互不攻擊 輸入格式 第一行有 2 個正整數n 和 m 1 n 200,0 m輸出格式 將計算出...