社区讨论

求助求助zkw只有63

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

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@mi6o8hjn
此快照首次捕获于
2025/11/20 08:06
4 个月前
此快照最后确认于
2025/11/20 08:06
4 个月前
查看原帖
自己按理解写的zkw。就是把Dinic的BFS改成了SPFA,结果四个点爆内存。始终不知道哪里出问题蒟蒻求助.
cpp #include<bits/stdc++.h> using namespace std; #define N 8500 #define M 60500 #define inf 0x3f3f3f3f int n,m,s,t; struct node { int to,last,flow,w; }E[M]; int beg[N],e=1,cur[N]; int Max_flow,Flow_ans; void add(int u,int v,int f,int w) { E[++e].to=v;E[e].last=beg[u];beg[u]=e;E[e].flow=f;E[e].w=w; E[++e].to=u;E[e].last=beg[v];beg[v]=e;E[e].flow=0;E[e].w=-w; } bool vis[N];int dis[N]; bool SPFA() { queueq; for(int i=1;i<=n;++i) dis[i]=inf; memset(vis,0,sizeof(vis)); q.push(s); vis[s]=1; dis[s]=0; while(!q.empty()) { int u=q.front(); vis[u]=0;q.pop(); for(int i=beg[u];i;i=E[i].last) { int v=E[i].to; if(E[i].flow && dis[v]>dis[u]+E[i].w) { dis[v]=dis[u]+E[i].w; if(!vis[v]) { vis[v]=1; q.push(v); } } } } return dis[t]<inf; } int dfs(int u,int add) { if(u==t || !add) return add; int flow=0,f; for(int i=beg[u];i;i=E[i].last) { int v=E[i].to; if(dis[v]==dis[u]+E[i].w && (f=(dfs(v,min(E[i].flow,add))))) { E[i].flow-=f; E[i^1].flow+=f; flow+=f; add-=f; Flow_ans+=E[i].w*f; if(!add) break; } } return flow; } void Dinic() { while(SPFA()) { Max_flow+=dfs(s,inf); } } int main() { int x,y,z,f; scanf("%d%d%d%d",&n,&m,&s,&t); for(int i=1;i<=m;++i) { scanf("%d%d%d%d",&x,&y,&f,&z); add(x,y,f,z); } Dinic(); printf("%d %d\n",Max_flow,Flow_ans); return 0; }
CPP

回复

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

正在加载回复...