玄关
查看原帖
玄关
1171250
w132326820楼主2025/8/1 15:12
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=500010,inf=0x3f3f3f3f3f3f3f3f;
int n,m,s,t,x,y,z,vi,T;
int v[N],w[N],d[N];
int ans,sum,h[N];
int pre[N],nxt[N];
int id;int q[N];
void add(int x,int y,int z,int vi){
	v[id]=y;w[id]=z;d[id]=vi;
	nxt[id]=pre[x];pre[x]=id++;
}
int now[N],book[N];
bool bfs(){
	memset(h,0x3f,sizeof(h));
	memset(book,0,sizeof(book));
	
	int head=0,tail=0;
	q[tail++]=s;
	book[s]=1;
	h[s]=0;
	now[s]=pre[s];
	while(head<tail){
		int l=q[head];
		head++;
       book[l]=0;
		for(int i=pre[l];i!=-1;i=nxt[i]){
			if(w[i]&&h[v[i]]>h[l]+d[i]){
				h[v[i]]=h[l]+d[i];
				now[v[i]]=pre[v[i]];
				if(book[v[i]]==0){
					book[v[i]]=1;
					q[tail++]=v[i];
				}
			}
		} 
	}
	return h[t]!=inf;
}
int dinic(int x,int flow){
	if(x==t)return flow;
	int res=0,k;
	book[x]=1;
	for(int i=now[x];flow&&i!=-1;i=nxt[i]){
        now[x]=i;
		if(!book[v[i]]&&w[i]>0&&h[v[i]]==h[x]+d[i]){
			k=dinic(v[i],min(w[i],flow));
			if(k==0)h[v[i]]=inf;
			res+=k;
			flow-=k;
			w[i]-=k;
			w[i^1]+=k;
			sum+=d[i]*k;
		}
	}
    book[x]=0;
    return res;
}
signed main(){
    cin>>T;
    while(T--){
        memset(v,0,sizeof(v));
        memset(w,0,sizeof(w));
        memset(d,0,sizeof(d));
        memset(pre,-1,sizeof(pre));
        memset(nxt,0,sizeof(nxt));
        id=0;
        cin>>n;
        s=0;t=n+1;
        for(int i=1;i<=n;i++){
            int x;
            cin>>x;
            add(s,i,x,0);
            add(i,s,0,0);
            add(i,t,1,0);
            add(t,i,0,0);
        }
        for(int i=1;i<=n;i++){
            int previouS=i-1,nexT=i+1;
            if(previouS==0)previouS=n;
            if(nexT==n+1)nexT=1;
            add(i,nexT,inf,1);
            add(nexT,i,0,-1);
            add(i,previouS,inf,1);
            add(previouS,i,0,-1);
        }
        while(bfs())dinic(s,inf);
        cout<<sum<<"\n";
    }
	return 0;
}




2025/8/1 15:12
加载中...