为什么我这个能ac?qwq
查看原帖
为什么我这个能ac?qwq
518166
IceSmoke楼主2023/3/9 21:57
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

const ll inf = 1e16;

int m,n;
ll sum;
ll ans = inf;
bool st[15][15];
ll g[15][15];

int dx[] = {0,0,1,-1},dy[] = {1,-1,0,0};
bool st1[15][15];

void dfs1(int x,int y)
{
	st1[x][y] = true;
	for(int i=0;i<4;i++)
	{
		int xi = x+dx[i],yi = y+dy[i];
		if(xi<1 || xi>n || yi<1 || yi>m) continue;
		if(!st1[xi][yi] && !st[xi][yi]) dfs1(xi,yi);
	}
}

//判断是否分成两个联通块
bool check()
{
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++) st1[i][j] = false;	
	}
	int cnt = 0;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if(st[i][j] || st1[i][j]) continue;
			if(cnt) return false;
			dfs1(i,j);
			cnt++;
		}
	}
	if(!cnt) return false;
	return true;
}

void dfs(int x,int y,ll d,ll tmp)
{
	st[x][y] = true;
	if(sum - tmp == tmp && check())
	{
		ans = min(ans,d);
		// st[x][y] = false;
		return;
	}
	for(int i=0;i<4;i++)
	{
		int xi = x+dx[i],yi = y+dy[i];
		if(xi<1 || xi>n || yi<1 || yi>m) continue;
		if(!st[xi][yi])
		{
			if(tmp+g[xi][yi]>sum/2) continue;
			dfs(xi,yi,d+1,tmp+g[xi][yi]);
		}
	}
	st[x][y] = false;
	return ;
}

int main()
{
	scanf("%d%d",&m,&n);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			scanf("%lld",&g[i][j]);
			sum += g[i][j];
		}
	}
	dfs(1,1,1,g[1][1]);
	if(ans==inf) printf("0");
	else printf("%lld",ans);
}
2023/3/9 21:57
加载中...