社区讨论
死循环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 条回复,欢迎继续交流。
正在加载回复...