求助除前三点ac其他万紫千红
查看原帖
求助除前三点ac其他万紫千红
473710
hmr26108楼主2022/4/11 21:14
#include<bits/stdc++.h>
#define maxn 1010
using namespace std;
int n,m,a[maxn][maxn],num[maxn][maxn];
int dis[maxn],h[maxn],tot=1;
int totflow,cnt;
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
int s,t;
struct node
{
	int c,v,next;
}e[maxn*100];
void add(int u,int v,int c)
{
	tot++;
	e[tot].c=c;
	e[tot].v=v;
	e[tot].next=h[u];
	h[u]=tot;
}
int bfs()
{
	queue<int> q;
	q.push(s);
	memset(dis,-1,sizeof(dis));
	dis[s]=0;
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		for(int i=h[u];i;i=e[i].next)
		{
			int v=e[i].v;
			if(e[i].c>0&&dis[v]<0)
			{
				
				dis[v]=dis[u]+1;
				q.push(v);
			}
		}
		if(dis[t]>0) return true;
	}
	return dis[t]>0;
}
int dfs(int u,int flow)
{
	if(u==t) return flow;
	int res=0;
	for(int i=h[u];i;i=e[i].next)
	{
		int v=e[i].v;
		if(dis[v]==dis[u]+1&&e[i].c>0)
		{
			int tmp=dfs(v,min(flow,e[i].c));
			if(tmp>0)
			{
				res+=tmp;
				flow-=tmp;
				e[i^1].c+=tmp;
				e[i].c-=tmp;
				if(flow<=0) break;
			}
		}
	}
	if(res==0) dis[u]=-1;
	return res;
}
void dinic()
{
	totflow=0;
	while(bfs())
	{
		totflow+=dfs(s,1<<30);
	}
	return ;
}
int main()
{
	scanf("%d%d",&n,&m);
	s=n*m+1,t=n*m+2;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++) scanf("%d",&a[i][j]);
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cnt++;
			if(a[i][j]==1) add(s,cnt,1<<30),add(cnt,s,0);
			if(a[i][j]==2) add(cnt,t,1<<30),add(t,cnt,0);
			num[i][j]=cnt;
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			for(int k=0;k<4;k++)
			{
				int tx=i+dx[k];
				int ty=j+dy[k];
				if(tx>=1&&ty>=1&&tx<=n&&ty<=m)
				{
					add(num[i][j],num[tx][ty],1);
					add(num[tx][ty],num[i][j],0);
				}
			}
		}
	}
	dinic();
	printf("%d",totflow);
	return 0;
}

不知道那里写错了,求救

2022/4/11 21:14
加载中...