蒟蒻求助
查看原帖
蒟蒻求助
229919
一E孤行楼主2021/6/22 16:06

网络流写法最大费用最大流 最后一个WA掉了

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int S,T,m,n;
#define M 60
#define inf 10000000
#define N 60
bool vis[M*N+10];
int num[300000],d[30608],pre[100000],tot,head[90000];
struct aaa{
	int to,next,c,w;
}a[400000];
bool spfa()
{
	memset(d,-0x7f7f7f7f,sizeof(d));
	queue<int> q;
	q.push(S);
	memset(vis,0,sizeof(vis));
	memset(pre,-1,sizeof(pre));
	vis[S]=true;
	d[S]=0;
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		vis[u]=false;
		for(int i=head[u];i!=-1;i=a[i].next)
		{
			int v=a[i].to;
			if(a[i].c)
			{
				if(d[v]<d[u]+a[i].w)
				{
					d[v]=d[u]+a[i].w;
					pre[v]=i;
					if(!vis[v])
					    q.push(v),vis[v]=true;
				}
			}
		}
	}
	return pre[T]!=-1;
}
int maxflow()
{
	int res=0;
	while(spfa())
	{
		int flow=80000000;
		for(int i=T;i!=S;i=a[pre[i]^1].to)
	    flow=min(flow,a[pre[i]].c);
     	for(int i=T;i!=S;i=a[pre[i]^1].to)
	    res+=a[pre[i]].w,a[pre[i]^1].c+=flow,a[pre[i]].c-=flow;
	}
	return res;
}
void add(int x,int y,int c,int w)
{
	a[tot].to=y;
	a[tot].c=c;
	a[tot].w=w;
	a[tot].next=head[x];
	head[x]=tot++;
} 
void add2(int x,int y,int c,int w)
{
 	add(x,y,c,w);
 	add(y,x,0,-w);
}
int main()
{
	memset(head,-1,sizeof(head));
	scanf("%d%d",&m,&n);
	T=50000;
	add2(S,1+m*n,2,0);
	add2(m*n,T,2,0);
	for(int i=1;i<=n*m;i++)
	    scanf("%d",&num[i]);
	for(int i=1;i<m;i++)
	    for(int j=1;j<n;j++)
	        add2((i-1)*n+j+m*n,(i-1)*n+j+1,inf,0),add2((i-1)*n+j+m*n,i*n+j,inf,0);
	for(int i=1;i<m;i++)
	    add2(i*n+m*n,(i+1)*n,inf,0);
	for(int j=1;j<n;j++)
	    add2((m-1)*n+j+m*n,(m-1)*n+j+1,inf,0);
	for(int i=1;i<=n*m;i++)
	    add2(i,i+m*n,1,num[i]);
	printf("%d",maxflow());
	return 0;
}
2021/6/22 16:06
加载中...