网络流20pts求助,
查看原帖
网络流20pts求助,
305854
Drind楼主2022/12/24 11:47

RT,只A了#1和#6

#include<bits/stdc++.h>
using namespace std;

long long cnt;
long long head[5001];
long long dis[5001];
long long pre[5001];

const long long inf=INT_MAX;

bool vis[5001];

long long n,m;

struct node
{
	long long to,nxt;
	long long cap,flow;
	long long cost; 
}edge[1000001];

long long mxflo;
long long mncos;

void add(long long u,long long v,long long w,long long c)
{
	edge[cnt].to=v;
	edge[cnt].cap=w;
	edge[cnt].flow=0;
	edge[cnt].cost=c;
	edge[cnt].nxt=head[u];
	head[u]=cnt++;
}

void adde(long long u,long long v,long long w,long long c)
{
	//cout<<u<<" -> "<<v<<endl;
	add(u,v,w,c);
	add(v,u,0,-c);
}

bool spfa(long long s,long long t)
{
	memset(vis,false,sizeof(vis));
	memset(pre,-1,sizeof(pre));
	memset(dis,0x3f,sizeof(dis));
	queue<long long>q;
	vis[s]=true;
	dis[s]=0;
	q.push(s);
	while(!q.empty())
	{
		long long u=q.front();
		q.pop();
		vis[u]=false;
		for(long long i=head[u];~i;i=edge[i].nxt)
		{
			long long v=edge[i].to;
			if(edge[i].cap>edge[i].flow&&dis[v]>dis[u]+edge[i].cost)
			{
				dis[v]=dis[u]+edge[i].cost;
				pre[v]=i;
				if(!vis[v])
				{
					q.push(v);
					vis[v]=true;
				}
			}
		}
	}
	return pre[t]!=-1;
}

void mcmf(long long s,long long t)
{
	long long d=0;
	while(spfa(s,t))
	{
		d=1e18;
		for(long long i=pre[t];~i;i=pre[edge[i^1].to])
			d=min(d,edge[i].cap-edge[i].flow);
		for(long long i=pre[t];~i;i=pre[edge[i^1].to])
		{
			edge[i].flow+=d;
			edge[i^1].flow-=d;
		} 
		mxflo+=d;
		mncos+=dis[t]*d;
	}
}

signed main()
{
	//freopen("P1251_2.in","r",stdin);
	//1 -> 2-3 -> 4-5 -> 6-7 -> 8
	//0    1      2      3      4
	memset(head,-1,sizeof(head));
	long long st,ed,N;
	long long p,m,f,n,s;
	long long a[4001];
	cin>>N;
	for(long long i=1;i<=N;i++)
	{
		cin>>a[i];
	}
	cin>>p>>m>>f>>n>>s;
	
	st=1;
	ed=n*2+2;
	
	for(long long i=1;i<=N;i++)
	{
		adde(st,i*2+1,a[i],0);
		adde(i*2,ed,a[i],0);
	}
	
	for(long long i=1;i<=N;i++)
	{
		if(i+1<=N) adde(i*2+1,i*2+3,inf,0);
		if(i+m<=N) adde(i*2+1,(i+m)*2,inf,f);
		if(i+n<=N) adde(i*2+1,(i+n)*2,inf,s);
		adde(st,i*2,inf,p); 
	}
	
	mcmf(st,ed);
	cout<<mncos;
}
2022/12/24 11:47
加载中...