社区讨论

刘汝佳蓝书代码竟然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 条回复,欢迎继续交流。

正在加载回复...