求调,dinic TLE最后2两点
查看原帖
求调,dinic TLE最后2两点
996089
dolphina楼主2023/10/27 08:01
#include<bits/stdc++.h>

#define int long long

#define maxn 400005

using namespace std;

const int inf=1e18;

template<class T>

inline T read(){
	T r=0,f=0;
	char c;
	while(!isdigit(c=getchar()))f|=(c=='-');
	while(isdigit(c))r=(r*10)+(c^48),c=getchar();
	return f?-r:r;
}

int n,m,s,t,p[maxn],diannum;

struct E{
	int Next,to,w;
}edge[maxn<<1];

int cnt=1,head[maxn];

int hu[maxn],level[maxn];

inline void addedge(int from,int to,int w){
	edge[++cnt]={head[from],to,w};
	head[from]=cnt;
}

inline bool bfs(){
	queue<int>q;
	for(int i=s;i<=t;i++)level[i]=0;
	q.push(s),level[s]=1;
	while(!q.empty()){
		int u=q.front();q.pop();
		hu[u]=head[u];
		for(int i=head[u];i;i=edge[i].Next){
			int to=edge[i].to,w=edge[i].w;
			if(w&&!level[to]){
				level[to]=level[u]+1;
				q.push(to);
				if(to==t)return true;
			}
		}
	}
	return false;
}

int sum=0,ans=0;

int dinic(int u,int flow){
	if(u==t)return flow;
	int rest=flow;
	for(int &i=hu[u];i;i=edge[i].Next){
		int to=edge[i].to,w=edge[i].w;
		if(w&&level[to]==level[u]+1){
			int increase=dinic(to,min(rest,edge[i].w));
			if(!increase)level[to]=0;
			edge[i].w-=increase;
			edge[i^1].w+=increase;
			rest-=increase;
			if(!rest)break;
		}
	}
	return flow-rest;
}

signed main(){
//	freopen("sol.in","r",stdin);
	n=read<int>(),m=read<int>();
	for(int i=1;i<=n;i++){
		p[i]=read<int>();
	}
	s=0,t=n+m+1;
	for(int i=1;i<=n;i++){
		addedge(i,t,p[i]);
		addedge(t,i,0);
	}
	diannum=n;
	for(int i=1;i<=m;i++){
		int u=read<int>();
		int v=read<int>();
		int c=read<int>();
		addedge(s,++diannum,c);
		addedge(diannum,s,0);
		addedge(diannum,u,inf);
		addedge(u,diannum,0);
		addedge(diannum,v,inf);
		addedge(v,diannum,0);
		sum+=c;
	}
	while(bfs())ans+=dinic(s,1e18);
	printf("%lld\n",sum-ans);
	return 0;
}

不知道哪里挂了

2023/10/27 08:01
加载中...