84分求助
查看原帖
84分求助
354820
boss11楼主2021/6/16 17:11
#include<bits/stdc++.h>
#define ll long long 
#define M 100001
using namespace std;
struct nb{
	ll n,v,w,q;
}ed[M<<3];
ll pop=1,tnt,n,m,ppp,s,t,ho[M],head[M],dep[M],vis[M],dis[M],pre[M],fff[M],qq,pp;
queue<ll>q;
void add(ll a,ll b,ll c,ll d)
{
	ed[++pop]=nb{head[a],b,c,d};head[a]=pop;
	ed[++pop]=nb{head[b],a,0,-d};head[b]=pop;
}
bool SPEA()
{
	for(ll i=1;i<=t+6000;i++)dis[i]=-1e18;
	dis[s]=0;fff[s]=1e18;q.push(s);
	memset(vis,0,sizeof(vis));
	while(!q.empty())
	{
		ll u=q.front();q.pop();vis[u]=0;
		for(ll i=head[u];i;i=ed[i].n)
		{
			ll v=ed[i].v;
			if(dis[v]<dis[u]+ed[i].q&&ed[i].w)
			{
				dis[v]=dis[u]+ed[i].q;
				fff[v]=min(ed[i].w,fff[u]);
				pre[v]=i;
				if(!vis[v])
				{
					vis[v]=1;
					q.push(v);
				}
			}
		}
	}return dis[t]!=-1e18;
}
ll ans,a[101][101];
void dfs()
{
	ll x=t,y,z;
	while(x!=s)
	{
		ll i=pre[x];ho[ed[i^1].v]=x;
		ed[i].w-=fff[t];
		ed[i^1].w+=fff[t];
		x=ed[i^1].v;
	}
	ans+=fff[t]*dis[t];
	x=ho[x];
	while(x!=t)
	{
		ll y=x;x=ho[x];
		if(x>4000)
		{
			x-=4000;
			if(x==y+1&&qq!=1)printf("%lld %lld\n",tnt,1);
			if(x==y+qq)printf("%lld %lld\n",tnt,0);
		}
		else
		{
			if(x==y+1&&qq!=1)printf("%lld %lld\n",tnt,1);
			if(x==y+qq)printf("%lld %lld\n",tnt,0);
		}
	}
}
ll f(ll i,ll j){return (i-1)*qq+j;}
int main()
{
	cin>>n>>qq>>pp;t=pp*qq,s=t+1;add(s,1,1,0);
	for(ll i=1;i<=pp;i++)
	for(ll j=1;j<=qq;j++)
	scanf("%lld",&a[i][j]);
	for(ll i=1;i<=pp;i++)
	for(ll j=1;j<=qq;j++)
	{
		if(a[i][j]==0)
		{
			if(i!=pp&&a[i+1][j]!=1)add(f(i,j),f(i+1,j),1e18,0);
			if(j!=qq&&a[i][j+1]!=1)add(f(i,j),f(i,j+1),1e18,0);
		}
		if(a[i][j]==2)
		{
			add(f(i,j)+4000,f(i,j),1,1);
			if(i!=1&&a[i-1][j]!=1)add(f(i-1,j),f(i,j)+4000,1e18,0);
			if(j!=1&&a[i][j-1]!=1)add(f(i,j-1),f(i,j)+4000,1e18,0);
			if(i!=pp&&a[i+1][j]!=1)add(f(i,j),f(i+1,j),1e18,0);
			if(j!=qq&&a[i][j+1]!=1)add(f(i,j),f(i,j+1),1e18,0);
		}
	}
	while(SPEA())
	{
		tnt++;add(s,1,1,0);
		dfs();if(tnt==n)break;
	}
}
2021/6/16 17:11
加载中...