社区讨论

求助

P3381【模板】最小费用最大流参与者 4已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mi7dck2e
此快照首次捕获于
2025/11/20 19:49
4 个月前
此快照最后确认于
2025/11/20 19:49
4 个月前
查看原帖

最后4个点WA了,最大流没问题,最小费用错了。
CPP
#include <bits/stdc++.h>
using namespace std;

struct node 
{
	int u;
	int v;
	int cap;//残量 
	int cost;
	int next;
};

const int MAXN=5005;
const int MAXM=50005;
int n,m,s,t;
long long mincost=0,maxcap=0;
long long dis[MAXN];

bool vis[MAXN];
int size=0;
int head[MAXN];
node edge[MAXM<<1];

inline int read()
{
	int X=0;
	char ch=getchar();
	while(ch<'0'||ch>'9') ch=getchar();
	while(ch>='0'&&ch<='9') 
	{
		X=(X<<1)+(X<<3)+ch-'0';
		ch=getchar();
	}
	return X;
}

void add(int u,int v,int cap,int cost)
{
	edge[size].u=u;
	edge[size].v=v;
	edge[size].cap=cap;
	edge[size].cost=cost;
	edge[size].next=head[u];
	head[u]=size++;
}

void readdata()
{
	memset(head,-1,sizeof(head));
	n=read();m=read();s=read();t=read();
	for(int i=1;i<=m;i++)
	{
		int u,v,cap,cost;
		u=read();v=read();cap=read();cost=read();
		add(u,v,cap,cost);
		add(v,u,0,cost);
	}
}

struct cmp
{
	bool operator () (const int a,const int b)
	{
		return dis[a]>dis[b];
	}
};

bool spfa()
{
    priority_queue<int,vector<int>,cmp> q;
	memset(dis,0x3f,sizeof(dis));
	memset(vis,0,sizeof(vis));
	dis[t]=0;
	vis[t]=1;
	q.push(t);
	while(!q.empty())
	{
		int u=q.top();
		q.pop();
		vis[u]=0;
		for(int i=head[u];i!=-1;i=edge[i].next)
		{
			int v=edge[i].v;
			int cap=edge[i^1].cap;
			int cost=edge[i^1].cost;
			if(cap>0&&dis[v]>dis[u]+cost)
			{
				dis[v]=dis[u]+cost;
				if(!vis[v])
				{
					q.push(v);
					vis[v]=1;
				}
			}
		}
	}
	return dis[s]<0x3f3f3f3f;
}

int dfs(int u,int flow)
{
	if(u==t||flow==0) return flow;
	int used=0;
	vis[u]=1;
	for(int i=head[u];i!=-1;i=edge[i].next)
	{
		int v=edge[i].v;
		int cap=edge[i].cap;
		int cost=edge[i].cost;
		if(cap>0&&!vis[v]&&dis[u]==dis[v]+cost)
		{
			long long f=dfs(v,min(cap,flow-used));
			mincost+=f*cost;
			used+=f;
			edge[i].cap-=f;
			edge[i^1].cap+=f;
			if(used==flow) break;
		}
	}
	return used;
}

void work()
{
	while(spfa())
	{
		memset(vis,0,sizeof(vis));
		maxcap+=dfs(s,1e9);
	}
	printf("%lld %lld",maxcap,mincost);
}

int main()
{
	readdata();
	work();
	return 0;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...