P3355 骑士共存问题
分析:
-
考虑骑士的位置(令 s = 行 数 + 列 数 s=行数+列数 s=行数+列数 )
若当前骑士放在 s s s 为奇数的位置,那么 8 8 8 个方向上的 8 8 8 个偶数位置不能放
将位置 s s s 按奇偶划分为两个集合(即黑白染色),问题便转换成了二分图匹配的问题
- 此题是让求最大独立集
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int M=1005, N=1e5+5;
vector <int> g[N];
int vis[N], pre[N];
bool dfs(int u,int tag)
{
if(vis[u]==tag) return false;
vis[u]=tag;
for(auto v : g[u])
{
if(!pre[v] || dfs(pre[v],tag))
{
pre[v]=u; return true;
}
}
return false;
}
char s[M];
int b[M][M];
int dx[9]={2,2,-2,-2,-1,-1,1,1};
int dy[9]={1,-1,1,-1,2,-2,2,-2};
signed main()
{
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int n,m;
cin>>n>>m;
int ans=n*n-m;
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
b[x][y]=1;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(!b[i][j] && (i+j)&1)
{
for(int k=0;k<8;k++)
{
int x=i+dx[k], y=j+dy[k];
if(x>0 && x<=n && y>0 && y<=n && !b[x][y])
{
int u=(i-1)*n+j, v=(x-1)*n+y;
g[u].push_back(v);
}
}
}
}
}
int sub=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
int u=(i-1)*n+j;
if(!b[i][j] && (i+j)%2 && dfs(u,u)) sub++;
}
}
cout<<ans-sub<<endl;
return 0;
}
P4304 [TJOI2013]攻击装置
买一送一,同样的题(水紫题~~)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int M=1005, N=1e5+5;
vector <int> g[N];
int vis[N], pre[N];
bool dfs(int u,int tag)
{
if(vis[u]==tag) return false;
vis[u]=tag;
for(auto v : g[u])
{
if(!pre[v] || dfs(pre[v],tag))
{
pre[v]=u; return true;
}
}
return false;
}
char s[M];
int b[M][M];
int dx[9]={2,2,-2,-2,-1,-1,1,1};
int dy[9]={1,-1,1,-1,2,-2,2,-2};
signed main()
{
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int n;
cin>>n;
int ans=n*n;
for(int i=1;i<=n;i++)
{
cin>>s+1;
for(int j=1;j<=n;j++)
{
if(s[j]=='1') b[i][j]=1, ans--;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(!b[i][j] && (i+j)%2)
{
for(int k=0;k<8;k++)
{
int x=i+dx[k], y=j+dy[k];
if(x>0 && x<=n && y>0 && y<=n && !b[x][y])
{
int u=(i-1)*n+j, v=(x-1)*n+y;
g[u].push_back(v);
}
}
}
}
}
int sub=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
int u=(i-1)*n+j;
if(!b[i][j] && (i+j)%2 && dfs(u,u)) sub++;
}
}
cout<<ans-sub<<endl;
return 0;
}