为什么我样例都过但是数据 ans 全输出 0
查看原帖
为什么我样例都过但是数据 ans 全输出 0
422996
HeCao2008楼主2022/12/29 20:36
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=15114<<1,inf=0x3f3f3f3f3f3f3f3f;
int val[maxn],c[maxn],dist[maxn],visit[maxn],head[maxn],to[maxn],nxt[maxn];
int n,m,s,t,cst=0,ans=0;
int cnt=1;
queue < int > q;
void add1(int u,int v,int w,int cost){
	nxt[++cnt]=head[u];
	to[cnt]=v;
	val[cnt]=w;
	c[cnt]=cost;
	head[u]=cnt;
}
void add2(int u,int v,int w,int cost){
	add1(u,v,w,cost);
	add1(v,u,0,-cost);
}
bool spfa(){
	memset(dist,inf,sizeof(dist));
	q.emplace(s);
	dist[s]=0;
	visit[s]=1;
	while(!q.empty()){
		int u=q.front();q.pop();
		visit[u]=0;
		for(int i=head[u];i;i=nxt[i]){
			if(val[i]&&dist[to[i]]>dist[u]+c[i]){
				dist[to[i]]=dist[u]+c[i];
				if(!visit[to[i]]){
					visit[to[i]]=1;
					q.emplace(to[i]);
				}
			}
		}
	}
	return dist[t]!=inf;
} 
int dfs(int u,int sum){
	if(u==t)return sum;
	visit[u]=1;
	int now=sum;
	for(int i=head[u];i&&now;i=nxt[i]){
		if(!visit[to[i]]&&val[i]&&dist[to[i]]==dist[u]+c[i]){
			int fa=dfs(to[i],min(now,val[i]));
			if(!fa)dist[to[i]]=inf;
			else{
				now-=fa;
				val[i]-=fa;
				val[i^1]+=fa;
				cst+=fa*c[i];
			}
		}
	}
	visit[u]=0;
	return sum-now;
}
int dinic(){
	while(spfa()){
//		memset(visit,0,sizeof(visit));
		ans+=dfs(s,inf);
	}
	return cst;
}
signed main(){
	ios::sync_with_stdio(false);
	memset(dist,inf,sizeof(dist));
	cin>>n>>m/*>>s>>t*/;
	s=1,t=n;
	for(int i=1;i<=m;i++){
		int u,v,w,x;
		cin>>u>>v>>w>>x;
		add2(u,v,w,x);
	}
	cout<<ans<<" "<<dinic();
	return 0;
}

2022/12/29 20:36
加载中...