蒟蒻C++ EK+SPFA 73求助
查看原帖
蒟蒻C++ EK+SPFA 73求助
722468
MrJC_Pandingding楼主2023/12/17 08:05
#include<bits/stdc++.h>
using namespace std;
const int maxm=5e4,maxn=5e3;
struct edg
{
	int nxt,u,v;
	long long f,w;
}e[maxm+5<<1];
int cnt,fst[maxn+10],i,m,n,pre[maxn+10],s,t,u,v;
bool by[maxm+5<<1],bz[maxn+10];
long long dis[maxn+10],f,mn,mx,summ,sumn,tmp,w;
void ad(int u,int v,long long w,long long f)
{
	e[cnt].u=u;
	e[cnt].v=v;
	e[cnt].w=w;
	e[cnt].f=f;
	e[cnt].nxt=fst[u];
	fst[u]=cnt++;
	e[cnt].u=v;
	e[cnt].v=u;
	e[cnt].f=-f;
	e[cnt].nxt=fst[v];
	fst[v]=cnt++;
	return;
}
long long bfs(int x)
{
	int i,y;
	queue<int>q;
	q.push(x);
	memset(pre,-1,sizeof(pre));
	memset(by,true,sizeof(by));
	memset(bz,true,sizeof(bz));
	memset(dis,127,sizeof(dis));
	dis[x]=0;
	bz[x]=false;
	do
	{
		y=q.front();
		q.pop();
		bz[y]=true;
		for(i=fst[y];~i;i=e[i].nxt)
		{
			if(e[i].w>0&&dis[e[i].v]>dis[y]+e[i].f)
			{
				dis[e[i].v]=dis[y]+e[i].f;
				pre[e[i].v]=i;
				if(by[i]&&bz[e[i].v])
				{
					q.push(e[i].v);
					by[i]=false;
					bz[e[i].v]=false;
				}
			}
		}
	}while(q.size());
	return dis[t];
}
int main()
{
	scanf("%d%d%d%d",&n,&m,&s,&t);
	memset(fst,-1,sizeof(fst));
	for(i=1;i<=m;++i)
	{
		scanf("%d%d%lld%lld",&u,&v,&w,&f);
		ad(u,v,w,f);
	}
	while(tmp=bfs(s))
	{
		mn=LLONG_MAX;
		if(tmp>=(LLONG_MAX>>1))
			break;
		for(i=pre[t];~i;i=pre[e[i].u])
			mn=min(mn,e[i].w);
		for(i=pre[t];~i;i=pre[e[i].u])
		{
			e[i].w-=mn;
			e[i^1].w+=mn;
		}
		sumn+=mn;
		summ+=mn*tmp;
	}
	printf("%lld %lld",sumn,summ);
	return 0;
}

记录,悬赏 55 关

2023/12/17 08:05
加载中...