MnZn求助whyMLE
查看原帖
MnZn求助whyMLE
1109215
guoxinchen楼主2024/12/26 18:27

rt

#include<bits/stdc++.h>
using namespace std;
struct node {
	long long v,w;
	bool operator<(const node &t)const {
		return t.w<w;
	}
};
priority_queue<node> q;
long long e[5005]= {};
long long w[100005]= {};
long long v[100005]= {};
long long ct[100005]= {};
long long nx[100005]= {};
long long h[5005]={};
long long top[5005]={};
long long aa=0;
long long dis[5005]={};
bool f[5005]={};
long long idx=2;
void add(long long a,long long b,long long c,long long d) {
	nx[idx]=e[a];
	e[a]=idx;
	w[idx]=c;
	v[idx]=b;
	ct[idx]=d;
	idx++;
}
long long n,m,s,t;
long long dij() {
	for(long long i=1;i<=n;i++)h[i]+=dis[i];
	for(long long i=1;i<=n;i++)dis[i]=1e9;
	for(long long i=1;i<=n;i++)f[i]=0;
	q.push({s,0});
	dis[s]=0;
	while(!q.empty()){
		node k=q.top();
		q.pop();
		if(f[k.v]!=0)continue;
		f[k.v]=1;
		for(long long i=e[k.v];i!=0;i=nx[i]){
			if(w[i]>0&&f[v[i]]==0&&dis[v[i]]>dis[k.v]+ct[i]+h[k.v]-h[v[i]]){
				dis[v[i]]=dis[k.v]+ct[i]+h[k.v]-h[v[i]];
				q.push({v[i],dis[v[i]]});
			}
		}
	}
	for(long long i=1;i<=n;i++){
		top[i]=e[i];
	}
	return dis[t];
}
long long dfs(long long u,long long f){
	long long ans=0;
	if(u==t||f==0)return f;
	for(long long &i=top[u];i!=0;i=nx[i]){
		if(dis[v[i]]!=dis[u]+ct[i]+h[u]-h[v[i]])continue;
		if(f>=w[i]){
			long long x=dfs(v[i],w[i]);
			aa+=ct[i]*x;
			w[i]-=x;
			w[i^1]+=x;
			f-=x;
			ans+=x;
		}else{
			long long x=dfs(v[i],f);
			aa+=ct[i]*x;
			w[i]-=x;
			w[i^1]+=x;
			f-=x;
			ans+=x;
		}if(f==0)return ans;
	}return ans;
}
int main() {
	cin>>n>>m>>s>>t;
	for(long long i=1; i<=m; i++) {
		long long a,b,c,d;
		scanf("%lld%lld%lld%lld",&a,&b,&c,&d);
		add(a,b,c,d);
		add(b,a,0,-d);
	}
	long long cnt=0;
	while(dij()!=1000000000){
		cnt+=dfs(s,1<<30);
	}cout<<cnt<<" "<<aa;
	return 0;
}

个人感觉可能是堆爆了(

2024/12/26 18:27
加载中...