EK蜜汁64
查看原帖
EK蜜汁64
430409
Coros_Trusds楼主2021/3/29 13:53

求找茬

#include <cstdio>

#include <cstring>

#include <queue>

#include <algorithm>

using namespace std;

const unsigned long INF=1e9+5;

const int MA=1000005;

struct Edge
{
	int v;
	
	int xedge;
};

Edge dis[MA];

struct Node
{
	int v;
	
	int val;
	
	int nxt;
};

Node node[MA];

bool inque[MA];

int n,m,s,t;

int top=1;

int head[MA];

inline void add(int u,int v,int w)
{
	top++;
	
	node[top].val=w;
	
	node[top].v=v;
	
	node[top].nxt=head[u];
	
	head[u]=top;
}

inline bool bfs()
{
	queue<int>q;
	
	memset(inque,0,sizeof(inque));
	
	memset(dis,-1,sizeof(dis));
	
	inque[s]=true;
	
	q.push(s);
	
	while(!q.empty())
	{
		int f=q.front();
		
		q.pop();
		
		for(register int i=head[f];i;i=node[i].nxt)
		{
			int d=node[i].v;
			
			if(inque[d]==false && node[i].val>0)
			{
				dis[d].v=f;
				
				dis[d].xedge=i;
				
				if(d==t)
				{
					return true;
				}
				
				inque[d]=true;
				
				q.push(d);
			}
		}
	}
	
	return false;
}

inline int Edmonds_Karp()
{
	int ans=0;
	
	while(bfs()==true)
	{
		int	Min=INF;
		
		for(register int i=t;i!=s;i=dis[i].v)
		{
			Min=min(Min,node[dis[i].xedge].val);
		}
		
		for(register int i=t;i!=s;i=dis[i].v)
		{
			node[dis[i].xedge].val-=Min;
			
			node[dis[i].xedge^1].val+=Min;
		}
		
		ans+=Min;
	}
	
	return ans;
}

int main()
{
	scanf("%d%d%d%d",&n,&m,&s,&t);
	
	for(register int i=1;i<=m;i++)
	{
		int u,v,w;
		
		scanf("%d%d%d",&u,&v,&w);
		
		add(u,v,w);
		
		add(v,u,0);
	} 
	
	printf("%d\n",Edmonds_Karp());
	
	return 0;
}
2021/3/29 13:53
加载中...