社区讨论

死循环ek求调

P4016负载平衡问题参与者 5已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@lumtlcae
此快照首次捕获于
2024/04/05 23:27
2 年前
此快照最后确认于
2024/04/05 23:27
2 年前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
int n,m,s,t;
const int maxn=600000,inf=0x7f7f7f7f;
int w,dis[maxn],incf[maxn],mcost,all;
int tot=1,pre[maxn],head[maxn],mval,a[maxn];
struct node
{
	int to,next,val,w;
}e[maxn];
bool vis[maxn];
void add(int u,int v,int val,int w)
{
	e[++tot].to=v;
	e[tot].val=val;
	e[tot].w=w;
	e[tot].next=head[u];
	head[u]=tot;
	e[++tot].to=u;
	e[tot].val=val;
	e[tot].w=-w;
	e[tot].next=head[v];
	head[v]=tot;
}

int spfa() {
	queue<int> q;
	memset(dis,inf,sizeof(dis));
	memset(vis,0,sizeof(vis));
	dis[s]=0; q.push(s); vis[s]=true; incf[s]=inf;
	while(!q.empty()){
		int u=q.front();q.pop();vis[u]=false;
		for(int i=head[u];i;i=e[i].next){
			if(!e[i].val) continue;
			int v=e[i].to;
			if(dis[v]>dis[u]+e[i].w){
				dis[v]=dis[u]+e[i].w;
				incf[v]=min(incf[u],e[i].val);
				pre[v]=i;
				if(!vis[v])	q.push(v),vis[v]=true;
			}
		}
	}
	return dis[t]!=inf;
}
void mc()
{
	while(spfa()){
		int x=t;
		mval+=incf[t];
		mcost+=dis[t]*incf[t];
		while(x!=s){
			int v=pre[x];
			e[v].val-=incf[t];
			e[v^1].val+=incf[t];
			x=e[v^1].to;
		}
	}
}

int main() {
	cin>>n;
	s=0;t=n+100; 
	for(int i=1;i<=n;i++)	cin>>a[i],all+=a[i];
	all=all/n;
	for(int i=1;i<=n;i++)
	{
		a[i]=a[i]-all;
		if(a[i]>0)
		{
			add(i,t,a[i],0);
		}
		else if(a[i]<0)
		{
			add(s,i,-a[i],0);
		}
	}
	for(int i=1;i<=n;i++)
	{
		if(i==1)
		{
			add(n,1,inf,1);
			add(1,n,inf,1);
		}
		else{
			add(i,i-1,inf,1);
			add(i-1,i,inf,1);
		}
	}
	mc();
	cout<<mcost;
	return 0;
}

回复

6 条回复,欢迎继续交流。

正在加载回复...