萌新求助,除第一个点AC全RE
查看原帖
萌新求助,除第一个点AC全RE
215590
Ckger楼主2021/8/4 10:18

rt,调不出来了,帮帮我吧QAQ

#include<iostream>
#include<cstdio>
#include<cstring>
#define foir(i,l,r) for (register int i=l;i<=r;++i)
#define fopr(i,l,r) for (register int i=l;i>=r;--i)
#define maxn 110
#define maxn2 100010
#define inf (1<<29)
using namespace std;

inline int read()
{
	int x=0;bool f=0;char c=getchar();
	while (!isdigit(c)) f|=c=='-',c=getchar();
	while (isdigit(c)) x=(x<<1)+(x<<3)+(c^48),c=getchar();
	return f?-x:x;
}

int n,m,s,t;
int front[maxn2],to[maxn2<<3],nxt[maxn2<<3],cap[maxn2<<3];
int a[maxn][maxn];

namespace prework
{
	int tot=1;
	inline void link(int u,int v,int f)
	{
		to[++tot]=v;
		nxt[tot]=front[u];
		front[u]=tot;
		cap[tot]=f;
		to[++tot]=u;
		nxt[tot]=front[v];
		front[v]=tot;
		cap[tot]=0;
	}
	
	int dx[4]={0,0,1,-1};
	int dy[4]={1,-1,0,0};
	
	inline int id(int x,int y) { return (x-1)*m+y; }
	
	inline void main()
	{
		n=read(),m=read();
		s=n*m+1,t=s+1;
		foir(i,1,n)
			foir(j,1,m)
				a[i][j]=read();
		foir(i,1,n)
			foir(j,1,m)
			{
				if (a[i][j]==1) link(s,id(i,j),inf);
				else if (a[i][j]==2) link(id(i,j),t,inf);
				foir(k,0,3)
				{
					int ni=i+dx[k],nj=j+dy[k];
					if (ni<1||ni>n||nj<1||nj>m) continue;
					if (a[i][j]==1)
						link(id(i,j),id(ni,nj),1);
					else if (a[i][j]!=2&&a[ni][nj]!=1)
						link(id(i,j),id(ni,nj),1);
				}
			}
		return void();
	}
}

namespace Dinic
{
	int lv[maxn],cur[maxn];
	int q[maxn],l,r;
	
	inline long long Min(long long a,long long b) { return a<b?a:b; }
	
	int dfs(int u,long long maxf)
	{
		if (u==t) return maxf;
		int res=0;
		for (register int i=cur[u];i;i=nxt[i])
		{
			int v=to[i];
			long long f=cap[i];
			cur[u]=i;
			if (lv[u]+1==lv[v]&&f)
			{
				f=dfs(v,Min(maxf-res,f));
				cap[i]-=f;
				cap[i^1]+=f;
				res+=f;
				if (res==maxf) return res;
			}
		}
		if (!res) lv[u]=-1;
		return res;
	}
	
	inline bool bfs()
	{
		memset(lv,0,sizeof lv);
		l=r=1;
		q[1]=s;
		lv[s]=1;
		cur[s]=front[s];
		while (l<=r)
		{
			int u=q[l];
			++l;
			if (u==t) return 1;
			for (register int i=front[u];i;i=nxt[i])
			{
				int v=to[i],f=cap[i];
				if (!lv[v]&&f)
					lv[v]=lv[u]+1,q[++r]=v,cur[v]=front[v];
			}
		}
		return 0;
	}
	
	inline long long dinic()
	{
		long long res=0;
		while (bfs())
			res+=dfs(s,2147483647);
		return res;
	}
}using namespace Dinic;

int main()
{
	prework::main();
	cout<<dinic()<<endl;
	return 0;
}
2021/8/4 10:18
加载中...