我这Dinic优化怕不是个假的。。。。
查看原帖
我这Dinic优化怕不是个假的。。。。
185026
NOIPer40楼主2020/10/21 15:05
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#define maxn 210
#define maxm 10010
#define ll long long
using namespace std;
ll n,m,s,t,head[maxn],to[maxm],nxt[maxm],cap[maxm],cnt=1,vis[maxn],dep[maxn],ans;
queue<ll> q;
void con(ll u,ll v,ll c){
	to[++cnt]=v;
	cap[cnt]=c;
	nxt[cnt]=head[u];
	head[u]=cnt;
}
void add(ll u,ll v,ll c){
	con(u,v,c);
	con(v,u,0);
}
bool bfs(){
	memset(dep,0,sizeof(dep));
	memset(vis,0,sizeof(vis));
	q.push(s);
	dep[s]=1;
	while(!q.empty()){
		ll f=q.front();
		q.pop();
		for(int i=head[f];i;i=nxt[i]){
			ll ti=to[i];
			if(dep[ti] || !cap[i])
				continue;
			dep[ti]=dep[f]+1;
			q.push(ti);
		}
	}
	return dep[t];
}
ll dfs(ll x,ll flow){
	ll maxf=0,rest=flow;
	vis[x]=1;
	if(x==t){
		ans+=flow;
		return flow;
	}
	for(int i=head[x];i;i=nxt[i]){
		ll ti=to[i],res=0;
		if(!cap[i] || vis[ti])
			continue;
		if(!vis[ti] && cap[i] && dep[ti]==dep[x]+1){
			res=dfs(ti,min(cap[i],rest));
			if(res){
				cap[i]-=res;
				cap[i^1]+=res;
				maxf+=res;
				rest-=res;
			}
		}
	}
	return maxf;
}
int main(){
	scanf("%lld%lld%lld%lld",&n,&m,&s,&t);
	for(int i=1;i<=m;i++){
		ll u,v,c;
		scanf("%lld%lld%lld",&u,&v,&c);
		add(u,v,c);
	}
	while(bfs())
		dfs(s,1e18);
	printf("%lld",ans);
	return 0;
}

#8 #9 TLE

2020/10/21 15:05
加载中...