关于本题变式,玄两关
查看原帖
关于本题变式,玄两关
777848
superkkkeee楼主2025/1/21 17:09

如果将棋盘变为n×mn\times m的,并且会告诉你每个位置的状态(1为有障碍),其余不变

输入

2 3
0 1 0
0 1 0

输出

2

code

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
int s,t;
int mp[201][201];
int dx[11]={1,1,2,2,-1,-1,-2,-2};
int dy[11]={-2,2,-1,1,-2,2,-1,1};
struct node
{
	int v,w;
	int id;
};
vector<node> p[41010];
int dep[41010];
int b[41010];
int c;
const int inf=1e15;
void add(int u,int v)
{
	int c=p[u].size();
	int cc=p[v].size();
	p[u].push_back({v,1,cc});
	p[v].push_back({u,0,c});
}
bool bfs()
{
	memset(dep,-1,sizeof(dep));
	dep[s]=0;
	queue<int> q;
	q.push(s);
	while(!q.empty())
	{
		int x=q.front(); q.pop();
		for(node xx:p[x])
		{
			int v=xx.v;
			int w=xx.w;
			if(dep[v]==-1&&w)
			{
				dep[v]=dep[x]+1;
				q.push(v);
			}
		}
	}
	memset(b,0,sizeof(b));
	return (dep[t]!=-1);
}
int dfs(int x,int y)
{
	if(x==t) return y;
	int siz=p[x].size();
	for(int i=b[x];i<siz;i++)
	{
		b[x]=i;
		node xx=p[x][i];
		int v=xx.v;
		int w=xx.w;
		int id=xx.id;
		if(dep[v]==dep[x]+1&&w)
		{
			int q=dfs(v,min(w,y));
			if(q)
			{
				p[x][i].w-=q;
				p[v][id].w+=q;
				return q;
			}
			else dep[v]=-1;
		}
	}
	return 0;
}
int dinic()
{
	int ret=0;
	while(bfs());
	{
		int q=dfs(s,inf);
		while(q)
		{
			ret+=q;
			q=dfs(s,inf);
		}
	}
	return ret;
}
signed main()
{
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cin>>mp[i][j];
			if(mp[i][j])
			{
				c++;
			}
		}
	}
	s=n*m+1,t=n*m+2;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if(mp[i][j])continue;
			int now=(i-1)*n+j;
			if((i+j)&1)
			{
				add(s,now);
				for(int k=0;k<=7;k++)
				{
					int xx=i+dx[i];
					int yy=j+dy[i];
					if(xx<1||yy<1||xx>n||yy>m||mp[xx][yy]) continue;
					add(now,(xx-1)*n+yy);
				}
			}
			else add(now,t);
		}
	}
	cout<<n*m-c-dinic();
    return 0;
}

死循环了,怀疑使建图错了

求条或给出其他思路

急!!!

2025/1/21 17:09
加载中...