EK 求助

P3376 【模板】网络最大流

critnos @ 2020-09-25 12:57:10

RT,#9 #10 一直 TLE,最好的差 40ms,真的卡不动了。。。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct edge
{
    int u,nxt,v;
}a[10005];
int head[205];
int book[205];
int col;
struct pret
{
    int pre,v;
}pre[205];
int cnt=1,n,s,t;
int q[10005];
int beg,ed;
void add(int x,int y,int v)
{
    a[++cnt].v=v;
    a[cnt].u=y;
    a[cnt].nxt=head[x];
    head[x]=cnt;
}
bool bfs()
{
    col++;
    ed=beg=0;
    q[ed++]=s;
    book[s]=col;
    while(beg!=ed)
    {
        int x=q[beg++],d;
        for(int i=head[x];i;i=a[i].nxt)
        {
            d=a[i].u;
            if(book[d]!=col&&a[i].v)
            {
                pre[d].v=x;
                pre[d].pre=i;
                if(d==t) return 1;
                book[d]=col;
                q[ed++]=d;
            }
        }
    }
    return 0;
}
int read()
{
    int s=0;
    char ch=getchar();
    while(ch<'0'||ch>'9') ch=getchar();
    while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
    return s;
}
ll EK()
{
    int i,mn;
    ll ans=0;
    while(bfs())
    {
        mn=INT_MAX;
        for(i=t;i!=s;i=pre[i].v)
            mn=min(mn,a[pre[i].pre].v);
        ans+=mn;
        for(i=t;i!=s;i=pre[i].v)
            a[pre[i].pre].v-=mn,a[pre[i].pre^1].v+=mn;
    }
    return ans;
}
int main()
{
    int m,x,y,v;
    scanf("%d%d%d%d",&n,&m,&s,&t);
    while(m--)
    {
        x=read(),y=read(),v=read();
        add(x,y,v);
        add(y,x,0);
    }
    cout<<EK();
} 

by pocafup @ 2020-09-25 13:10:01

10卡过去了一次,9真的卡不过去,最好差了 20 ms


by 某科学的蒟蒻 @ 2020-09-25 14:05:03

您写下多路增广之类的?


by YLWang @ 2020-09-25 15:46:50

网络流题根据相关法律法规是卡 EK 放 Dinic 的


by critnos @ 2020-09-26 13:15:23

@pocafup @某科学的蒟蒻 @YLWang thx


|