样例2输出30玄关求条
查看原帖
样例2输出30玄关求条
982518
sjwhsss楼主2024/12/23 21:43

RT

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e3+5 , inf = 1e9;
int n , m , s , t , head[maxn*maxn] , dep[maxn*maxn] , now[maxn*maxn] , cnt = 1 , ans;
int dir[9][2]={{1 , 3} , {-1 , 3} , {-1 , -3} , {1 , -3} , {3 , 1} , {-3 , 1} , {3 , -1} , {-3 , -1}};
bool vis[maxn][maxn];
struct edge
{
	int u , v , w , next;
}e[maxn*maxn];
void Insert(int u , int v , int w)
{
	e[++cnt].u=u , e[cnt].v=v , e[cnt].w=w , e[cnt].next=head[u] , head[u]=cnt;
	e[++cnt].u=v , e[cnt].v=u , e[cnt].w=0 , e[cnt].next=head[v] , head[v]=cnt;
}
bool Bfs()
{
	for (int i = 1; i <= n; i++)dep[i]=inf , now[i]=head[i];
	queue <int>q;
	q.push(s),dep[s]=0;
	while(q.size())
	{
		int u = q.front();
		q.pop();
		for (int i = head[u]; i; i = e[i].next)
		{
			int v = e[i].v , w = e[i].w;
			if (w > 0 && dep[v] >= inf)
			{
				q.push(v);
				dep[v] = dep[u] + 1;
				if (v == t)return 1;
			}
		}
	}
	return 0;
}
int Dfs(int u , int sum)
{
	if (u == t)return sum;
	int res = 0;
	for (int i = now[u]; i && sum > 0; i = e[i].next)
	{
		now[u] = i;
		int v = e[i].v , w = e[i].w;
		if (w > 0 && dep[v] == dep[u] + 1)
		{
			int k = Dfs(v , min(w , sum));
			if (k <= 0)dep[v]=0;
			e[i].w-=k;
			e[i^1].w+=k;
			sum-=k;
			res+=k;
		}
	}
	return res;
}
void Dinic(){while(Bfs())ans+=Dfs(s , inf);}
bool check(int x , int y){return x >= 1 && x <= n && y >= 1 && y <= m && vis[x][y]^1;}
int d(int x , int y){return (x - 1) * n + y;}
int main ()
{
	int k , tmp = 0;
	scanf("%d%d%d" , &n , &m , &k);
	s = n * m + 1 , t = n * m + 2;
	for (int i = 1 , x , y; i <= k; i++)scanf("%d%d" , &x , &y),tmp+=vis[x][y]^1,vis[x][y]=1;
	for (int i = 1; i <= n; i++)
	{
		if (i & 1 ^ 1)
		{
			for (int j = 1; j <= m; j++)
			{
				Insert(s , d(i , j) , 1);
				if (check(i , j) ^ 1)continue;
				for (int k = 0; k < 8; k++)
				{
					int dx = i + dir[k][0] , dy = j + dir[k][1];
					if (check(dx , dy))Insert(d(i , j) , d(dx , dy) , 1);
				}
			}
		}
		else for (int j = 1; j <= m; j++) Insert(d(i , j) , t , 1);
	}
	n = t;
	Dinic();
	printf("%d\n" , n - 2 - ans - tmp);
	return 0;
}
2024/12/23 21:43
加载中...