社区讨论

萌新求助 TLE 只有70

P3376【模板】网络最大流参与者 3已保存回复 6

讨论操作

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

当前回复
6 条
当前快照
1 份
快照标识符
@mi7patv4
此快照首次捕获于
2025/11/21 01:24
4 个月前
此快照最后确认于
2025/11/21 01:24
4 个月前
查看原帖
刚接触dinic
不是很懂优化
求大佬帮忙
CPP
//Dinic
#include<bits/stdc++.h>
using namespace std;
#define N 100010
#define INF 0x3fffffff
inline int read() {
    int x = 0,f = 1;
    char ch = getchar();
    while(ch<'0'||ch>'9') { if(ch=='-') f = -1; ch = getchar(); }
    while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    return x * f;
}
struct point{
    int fr,to,val;
    int nxt;
}edge[N];
int cur[N];//听说可以弧优化
int head[N];
int cnt;
void add_edge(int x,int y,int z)
{
    edge[cnt].fr=x,edge[cnt].to=y,edge[cnt].val=z;
    edge[cnt].nxt=head[x],head[x]=cnt++;
    edge[cnt].fr=y,edge[cnt].to=x,edge[cnt].val=0;
    edge[cnt].nxt=head[y],head[y]=cnt++;
}
//我放弃链式前向星
int n,m,st,ed;
int deep[N];
int BFS()
{
    queue<int>q;
    for(int i=0;i<=n;i++) cur[i]=head[i],deep[i]=0;
    q.push(st);
    deep[st]=1;
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        for(int i=head[u];i!=-1;i=edge[i].nxt)
        {
            int tmp=edge[i].to;
            if(edge[i].val<=0 || deep[tmp]) continue;
            deep[tmp]=deep[u]+1;
            q.push(tmp);
        }
    }
    return deep[ed];
}
int ans;
int dfs(int u,int flow)//flow为到达终点最多能增广的值
{
    if(u==ed) return flow;
    int add=0;
    for(int i=cur[u];i!=-1&&add<flow;i=edge[i].nxt)
    {
        cur[u]=i;
        int v=edge[i].to;
        if(deep[v]!=deep[u]+1) continue;
        if(!edge[i].val) continue;//剪枝
        int tmpadd=dfs(v,min(edge[i].val,flow-add));
        edge[i].val-=tmpadd;
        edge[i^1].val+=tmpadd;//sub
        add+=tmpadd;
    }
    return add;
}
void Dinic()
{
    while(BFS()) ans+=dfs(st,INF);
}
int main()
{
    n=read(),m=read(),st=read(),ed=read();
    memset(head,-1,sizeof(head));
    for(int i=1,u,v,co;i<=m;i++)
    {
        u=read(),v=read(),co=read();
        add_edge(u,v,co);
    }
    Dinic();
    printf("%d\n",ans);
    return 0;
}

回复

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

正在加载回复...