蒟蒻C++样例不过求调
查看原帖
蒟蒻C++样例不过求调
722468
MrJC_Pandingding楼主2024/1/7 10:05
#include<bits/stdc++.h>
using namespace std;
const int maxn=100;
struct edg
{
	int c,nxt,t;
	double w;
}e[maxn+1<<3||2];
int cnt,fst[maxn+10],i,n,s=1,t;
bool bz[maxn+10];
double sumn,tmp,tot;
long long a[maxn+10],dis[maxn+10];
queue<int>q;
void ad(int u,int v,double w,int c)
{
	e[cnt].t=v;
	e[cnt].w=w;
	e[cnt].c=c;
	e[cnt].nxt=fst[u];
	fst[u]=cnt++;
	return;
}
bool spf(int x)
{
	int i,y;
	memset(bz,true,sizeof(bz));
	memset(dis,127,sizeof(dis));
	q.push(x);
	dis[x]=bz[x]=0;
	while(q.size())
	{
		y=q.front();
		q.pop();
		bz[y]=true;
		for(i=fst[y];~i;i=e[i].nxt)
		{
			if(e[i].w!=0&&dis[e[i].t]>dis[y]+e[i].c)
			{
				dis[e[i].t]=dis[y]+e[i].c;
				if(bz[e[i].t])
				{
					q.push(e[i].t);
					bz[e[i].t]=false;
				}
			}
		}
	}
	return dis[t]!=0x7f7f7f7f7f7f7f7f;
}
double dfs(int x,double mn)
{
	int i;
	double ans=0,sumn=0,tmp;
	if(x==t)
		return mn;
	bz[x]=false;
	for(i=fst[x];~i;i=e[i].nxt)
	{
		if(bz[e[i].t]&&e[i].w!=0.0&&dis[e[i].t]==dis[x]+e[i].c)
		{
			tmp=dfs(e[i].t,min(mn-ans,e[i].w));
			e[i].w-=tmp;
			e[i^1].w+=tmp;
			ans+=tmp;
			sumn+=tmp*e[i].c;
		}
	}
	bz[x]=true;
	return sumn;
}
int main()
{
	scanf("%d",&n);
	t=n+2;
	memset(fst,-1,sizeof(fst));
	for(i=1;i<=n;++i)
	{
		scanf("%lld",&a[i]);
		tot+=a[i];
		ad(1,i+1,a[i],0);
		ad(i+1,1,0,0);
	}
	tot/=n;
	for(i=1;i<=n;++i)
	{
		ad(i,i%n+1,1.0*LLONG_MAX,1);
		ad(i%n+1,i,0,-1);
		ad(i%n+1,i,1.0*LLONG_MAX,1);
		ad(i,i%n+1,0,-1);
	}
	for(i=1;i<=n;++i)
	{
		ad(i+1,n+2,tot,0);
		ad(n+2,i+1,0,0);
	}
	while(spf(s))
	{
		memset(bz,true,sizeof(bz));
		while(tmp=dfs(s,1.0*LLONG_MAX))
			sumn+=tmp;
	}
	printf("%g",sumn);
	return 0;
}

输出:

0

悬赏三个关注

2024/1/7 10:05
加载中...