社区讨论

DINIC会TLE??

P2740[USACO4.2] 草地排水 Drainage Ditches参与者 4已保存回复 22

讨论操作

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

当前回复
22 条
当前快照
1 份
快照标识符
@mi8656sr
此快照首次捕获于
2025/11/21 09:15
4 个月前
此快照最后确认于
2025/11/21 09:59
4 个月前
查看原帖
这道板子体最后一个点一直TLE
加了弧优化也不行
求dalao帮忙看看吧qaq
CPP
// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define maxn 1000010
#define inf 0x7fffffff
using namespace std;

inline int read(){
    int x=0,t=1; char ch=getchar();
    while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
    if(ch=='-') t=-1,ch=getchar();
    while(ch<='9'&&ch>='0') x=x*10+ch-48,ch=getchar();
    return x*t;
}

int n,m;
struct EDGE{
    int next,to,val;
    int depth;
}edge[maxn<<1];
int head[maxn],cnt;
int u,v,w;
int cur[maxn];

inline void add(int u,int v,int w){
    edge[++cnt].to=v;
    edge[cnt].val=w;
    edge[cnt].next=head[u];
    head[u]=cnt;
}

inline bool bfs(){
    queue<int> q;
    while(!q.empty()) q.pop();
    for(register int i=1;i<=n;++i) edge[i].depth=0;
    edge[1].depth=1;
    q.push(1);
    while(!q.empty()){
        int u=q.front(); q.pop();
        for(register int i=head[u];i!=-1;i=edge[i].next){
            int v=edge[i].to;
            if(edge[i].val>0&&edge[v].depth==0){
                edge[v].depth=edge[u].depth+1;
                q.push(v);
            }
        }
    }
    if(edge[m].depth>0) return 1;
    return 0;
}

inline int dinic(int u,int dis){
    if(u==m) return dis;
    for(register int &i=cur[u];i+1;i=edge[i].next){
        int v=edge[i].to;
        if(edge[i].val>0&&edge[v].depth==edge[u].depth+1){
            int minn=dinic(v,min(dis,edge[i].val));
            if(minn>0){
                edge[i].val-=minn;
                edge[i^1].val+=minn;
                return minn;
            }
        }
    }
    return 0;
}

int main(){
    cnt=-1;
    memset(head,-1,sizeof(head));
    n=read(); m=read();
    for(register int i=1;i<=n;++i){
        u=read(); v=read(); w=read();
        add(u,v,w); add(v,u,0);
    }
    int ans=0;
    while(bfs()){
    	for(register int i=1;i<=m;++i) cur[i]=head[i];
        while(int sum=dinic(1,inf)) ans+=sum;
    }
    printf("%d\n",ans);
    return 0;
}

回复

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

正在加载回复...