社区讨论
刘汝佳蓝书代码竟然tle三个点。。。
P3381【模板】最小费用最大流参与者 14已保存回复 14
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 14 条
- 当前快照
- 1 份
- 快照标识符
- @mi5i4jk3
- 此快照首次捕获于
- 2025/11/19 12:27 4 个月前
- 此快照最后确认于
- 2025/11/19 12:37 4 个月前
完全临摹《训练指南》的代码。。。后三个点tle。。。求dalao帮忙优化
CPP//P3381 【模板】最小费用最大流
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int N=5000+7,M=50000+7,W=1e8+7;
struct edge
{
int u,v,w,f,l;
//from,to,cap,cost,flow
} e[M<<1];
int n,m,s,t,d[N],p[N],a[N],ff,ll;
vector<int> g[N];
bool b[N];
queue<int> q;
inline void input(int& i,int& ii,int& iii,int& iiii) {scanf("%d%d%d%d",&i,&ii,&iii,&iiii);}
inline void output(int i,int j) {printf("%d %d\n",i,j);}
bool bfs()
{
for(int i=1;i<=n;i++)
d[i]=W;
memset(b,0,sizeof(b));
// while(!q.empty())
// q.pop();
d[s]=0;
b[s]=1;
p[s]=0;
a[s]=W;
q.push(s);
while(!q.empty())
{
int qf=q.front();
q.pop();
b[qf]=0;
for(int i=0;i<g[qf].size();i++)
{
edge& eg=e[g[qf][i]];
if(eg.w>eg.l&&d[eg.v]>d[qf]+eg.f)
{
d[eg.v]=d[qf]+eg.f;
p[eg.v]=g[qf][i];
a[eg.v]=min(a[qf],eg.w-eg.l);
if(!b[eg.v])
{
q.push(eg.v);
b[eg.v]=1;
}
}
}
}
if(d[t]==W)
return 0;
ll+=a[t];
ff+=d[t]*a[t];
for(int i=t;i!=s;i=e[p[i]].u)
{
e[p[i]].l+=a[t];
e[p[i]^1].l-=a[t];
}
// output(ff,ll);
return 1;
}
int main()
{
input(n,m,s,t);
int ui,vi,wi,fi;
for(int i=0;i<m;i++)
{
input(ui,vi,wi,fi);
e[i<<1]=(edge){ui,vi,wi,fi,0};
e[i<<1|1]=(edge){vi,ui,0,-fi,0};
g[ui].push_back(i<<1);
g[vi].push_back(i<<1|1);
}
while(bfs());
output(ll,ff);
return 0;
}
回复
共 14 条回复,欢迎继续交流。
正在加载回复...