用了200ms,看榜单有12ms的能说一下是用什么算法过的?

P3376 【模板】网络最大流

丽尔巴茨 @ 2019-06-25 02:11:46

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>

using namespace std;
const int maxn=1e4+7,maxm=2e5+7,inf=0x3f3f3f3f;
int h[maxn],e[maxm],ne[maxm],w[maxm],idx;
int dep[maxn];
int n,m,s,t;

void add(int a,int b,int c){
    e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
bool bfs(int s,int t){
    memset(dep,0,sizeof dep);
    dep[s]=1;queue<int>q;q.push(s);
    while(q.size()){
        int u=q.front();q.pop();
        if(u==t)break;
        for(int i=h[u];~i;i=ne[i]){
            int j=e[i];
            if(!dep[j]&&w[i]>0)dep[j]=dep[u]+1,q.push(j);
        }
    }
    if(dep[t])return 1;
    return 0;
}

int dfs(int x,int v){
    if(x==t||v==0)return v;
    int f,res=0;
    for(int i=h[x];~i;i=ne[i]){
        int j=e[i];
        if(dep[j]==dep[x]+1){
            f=dfs(j,min(w[i],v));
            w[i]-=f,w[i^1]+=f,v-=f,res+=f;
            if(v==0)break;
        }
    }
    return res;
}
int main()
{
    int a,b,c;
    scanf("%d%d%d%d",&n,&m,&s,&t);
    memset(h,-1,sizeof h);
    while(m--){
        scanf("%d%d%d",&a,&b,&c);
        add(a,b,c);add(b,a,0);
    }
    int ans=0;
    while(bfs(s,t))ans+=dfs(s,inf);
    printf("%d\n",ans);
    return 0;
}

200ms完成,12ms的大佬是怎么过的能说一下嘛?


by 小粉兔 @ 2019-06-25 03:16:08

SAP


by NaCly_Fish @ 2019-06-25 07:20:23

@小粉兔 兔兔怎么还修仙啊,明天不上课吗qwq


by かなで @ 2019-06-25 09:08:57

@丽尔巴茨 虽然我只是一个16ms的菜鸡....但我用的是ISAP


by wxwoo @ 2019-06-25 09:47:39

HLPP(但好像这玩意常数巨大


by 丽尔巴茨 @ 2019-06-25 10:57:29

谢谢大佬们


|