求助dinic
查看原帖
求助dinic
374715
hjfjwl楼主2024/3/15 20:17
#include <bits/stdc++.h>
using namespace std;
const int N = 20005;
const int INF = 0x3f3f3f3f;
const int M = 100005;
int n,m,s,t;
int head[N];
int to[M];
int nxt[M];
int w[M];
int id = 1;
void add(int x,int y,int z)
{
	id++;
	nxt[id] = head[x];
	to[id] = y;
	w[id] = z;
	head[x] = id;
}

/************Dinic************/
int dist[N];
int now[N];
bool bfs()
{
	for(int i = 0;i <= n * m*3;i++)dist[i] = INF;
	dist[s] = 0;
	queue<int>q;
	q.push(s);
	now[s] = head[s];
	while(!q.empty())
	{
		int u = q.front();
		q.pop();
		for(int i = head[u];i;i = nxt[i])
		{
			int v = to[i];
			int z = w[i];
			if(z > 0 && dist[v] == dist[0])
			{
				q.push(v);
				now[v] = head[v];
				dist[v] = dist[u] + 1;
				if(v == t)
				{
					return true;
				}
			}
		 } 
	}
	return false;
}
int dfs(int u,int ans)
{
//	cout << u << endl;
	if(u == t)
	{
		return ans;
	}
	int sum = 0,tt = 0;
	for(int i = now[u];ans && i;i = nxt[i])
	{
		now[u]=i;
		int v = to[i];
		int z =w[i];
		if(dist[v] == dist[u] + 1 && z>0)
		{
			tt = dfs(v,min(ans,z));
			w[i] -= tt;
			w[i ^ 1] += tt;
			sum += tt;
			ans -= tt;
		}
	 } 
	 return sum;
}
int r,c;
char a[55][55];
int dx[5];
int dy[5];
signed main()
{
	int cnt = 0;
	scanf("%d%d%d%d",&n,&m,&r,&c);
	for(int i = 1;i <= n;i++)
	{
		for(int j = 1;j <= m;j++)
		{
			cin >> a[i][j];
			if(a[i][j] == 'x')cnt++;
		}
	}
	s = 2 * n * m ;
	t = 2 * n * m + 1;
	dx[0] = dy[1] = r;
	dx[2] = dx[3] = c;
	dy[0] = c;
	dy[1] = -c;
	dy[2] = r;
	dy[3] = -r;
	for(int i = 1;i <= n;i++)
	{
		for(int j = 1;j <= m;j++)
		{
			if(a[i][j] == '.')
				for(int k = 0;k <= 3;k++)
				{
					int nx = i + dx[k];
					int ny = j + dy[k];
					if(1 <= nx && nx <= n && 1 <= ny && ny<= m && a[nx][ny] == '.')
					{
						add((i - 1) * m + j,(nx - 1) * m + ny + n * m,1);
						add((nx - 1) * m + ny + n * m,(i - 1) * m + j,0);
					}
				}
			add(s,(i - 1) * m + j,1);
			add((i - 1) * m + j,s,0);
			add((i - 1) * m + j + n * m,t,1);
			add(t,(i - 1) * m + j + m * n,0);
		}
	}
	int ans = 0;
	while(bfs())ans+=dfs(s,INF);
	cout << n * m - cnt - ans << endl;
	return 0;
}

跑出来的结果有问题,不知道那不有错。

2024/3/15 20:17
加载中...