MnZn求助ISAP,码风还行求看看
查看原帖
MnZn求助ISAP,码风还行求看看
33063
Focus_on楼主2021/12/1 17:59

rt,可能写法有点不一样,是在教练给的思路下自己写的没看题解。轻D

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>

using namespace std;

queue<int> q;

int n,m,s,t,u,v,d;
int dis[210][210],dep[210],sum[210];
bool gap,vis[210];
long long ans=0;

void bfs(){
	
	q.push(t);
	vis[t]=1;
	dep[t]=0;
	sum[0]=1;
	
	while(!q.empty()){
		
		int x=q.front();
		q.pop();
		
		for(int i=1;i<=n;i++)
		if(!vis[i]&&dis[i][x]){
			q.push(i);
			vis[i]=1;
			dep[i]=dep[x]+1;
			sum[dep[i]]++;
		}
	}
}

int now[210],cnt;

void ISAP(int x,int mn){
	
	if(gap) return;
	
	if(x==t){
		
		ans+=mn;
		
		for(int i=1;i<cnt;i++)
			dis[now[i]][now[i+1]]-=mn,dis[now[i+1]][now[i]]+=mn;
		
		return;
	}
	
	for(int i=1;i<=n;i++)
	if(dis[x][i]&&dep[x]>dep[i]){
		now[++cnt]=i;
		ISAP(i,min(mn,dis[x][i]));
		if(gap) return;
		now[cnt--]=0;
	}
	
	--sum[dep[x]];
	if(!sum[dep[x]]){
		gap=1;
		return;
	}
	
	++dep[x];
	++sum[dep[x]];
}

int main(){
	
	scanf("%d%d%d%d",&n,&m,&s,&t);
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&u,&v,&d);
		dis[u][v]+=d;
	}
	
	bfs();
	gap=0;
	
	while(!gap) now[cnt=1]=s,ISAP(s,1e9);
	
	printf("%lld\n",ans);
	return 0;
}
2021/12/1 17:59
加载中...