社区讨论
玄关求条
P3381【模板】最小费用最大流参与者 1已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @m02j402j
- 此快照首次捕获于
- 2024/08/20 22:37 2 年前
- 此快照最后确认于
- 2025/11/04 22:54 4 个月前
TLEon9 退流有问题但不知道哪里错了
CPP#include<bits/stdc++.h>
using namespace std;
#define pr pair<int,int>
const int inf=1e9+10;
const int N=5e3+10,M=1e5+10;
int n,m,s,t;
struct node{
int to,nxt,f,w;
}edge[M];
int head[N],cnt=1;
void add(int u,int v,int f,int w){
edge[++cnt]=node{v,head[u],f,w},head[u]=cnt;
edge[++cnt]=node{u,head[v],0,-w},head[v]=cnt;
}
int h[N],vis[N];
int lst[N],dis[N],flow[N];
int max_flow,min_cost;
void spfa(){
queue<int> q;
memset(h,0x7f,sizeof(h));
h[s]=0,vis[s]=1,q.push(s);
while(!q.empty()){
int u=q.front(); q.pop();
vis[u]=1;
for(int i=head[u];i;i=edge[i].nxt){
int v=edge[i].to,w=edge[i].w;
if(edge[i].f&&h[v]>h[u]+w){
h[v]=h[u]+w;
if(!vis[v]){
vis[v]=1;
q.push(v);
}
}
}
}
}
bool dij(){
priority_queue<pr,vector<pr>,greater<pr> >q;
for(int i=1;i<=n;i++) dis[i]=inf,vis[i]=0;
dis[s]=0,flow[s]=inf;
q.push(make_pair(0,s));
while(!q.empty()){
int u=q.top().second; q.pop();
if(vis[u]) continue;
vis[u]=1;
for(int i=head[u];i;i=edge[i].nxt){
int v=edge[i].to,w=edge[i].w+h[u]-h[v],f=edge[i].f;
if(f&&dis[v]>dis[u]+w){
flow[v]=min(flow[u],f);
dis[v]=dis[u]+w;
lst[v]=i;
q.push(make_pair(dis[v],v));
}
}
}
return (dis[t]!=inf);
}
signed main(){
//ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>m>>s>>t;
for(int i=1;i<=m;i++){
int u,v,f,c;
cin>>u>>v>>f>>c;
add(u,v,f,c);
}
spfa();
while(dij()){
max_flow+=flow[t];
min_cost+=flow[t]*(dis[t]-h[s]+h[t]);
for(int i=t;i!=s;i=edge[lst[i]^1].to){
edge[lst[i]].f-=flow[t];
edge[lst[i]^1].f+=flow[t];
}
for(int i=1;i<=n;i++) h[i]+=dis[i];
}
cout<<max_flow<<" "<<min_cost<<'\n';
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...