最大流问题,FF算法:

链式前向星建边,异或来求反向边。

const int N=2e3+86;
struct edge{int to,nxt,w;}e[N*2];int hd[N],tot=1;
void add(int u,int v,int w){
    e[++tot]=(edge){v,hd[u],w}; hd[u]=tot;
}
int n,m,x;
bitset<286> vis;

int dfs(int p,int flow){
    if(p==n)
    return flow;
    vis[p]=1;
    for(int eg=hd[p];eg;eg=e[eg].nxt){
        int to=e[eg].to,vol=e[eg].w,c;
        if(vol&&!vis[to]&&((c=dfs(to,min(vol,flow)))!=-1)){
            e[eg].w-=c;
            e[eg^1].w+=c;
            return c;
        }
    }
    return -1;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>m>>x;
    f(i,1,m){
        int x,y,val;
        cin>>x>>y>>val;
        add(x,y,val);
        add(y,x,0);
    }
    LL ans=0,c;
    while((c=dfs(1,3e8))!=-1){
        vis.reset();
        //cout<<c<<"\n";
        ans+=c;
    }
    if(ans){
    cout<<ans<<" ";
    cout<<(x/ans+(x%ans?1:0));}
    else cout<<"Orz Ni Jinan Saint Cow!";
    return 0;
}
此文章已被阅读次数:正在加载...更新于