既然已经进SCUACM冬季集训了

那就学点感兴趣的东西吧!

从网络流先开始OvO

最大流

反正一个最基础的想法就是,建反向边,然后贪心。

感觉增广路也是为我的贪心服务。

我也不知道我的是什么方法反正loj模板题过了。。。

#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int M=5010;
const int N=210;
int fi[M*2],ne[M*2],la[M*2],a[M*2],c[M*2];
long long ans;
int d[N],head[N];
int i,j,k,n,m,x,y,z,s,t;
void add(int x,int y,int t){
    k++;a[k]=y;c[k]=t;
    if (fi[x]==0)fi[x]=k;else ne[la[x]]=k;
    la[x]=k;
}
long long dfs(int x,long long T){
    long long w=0;
    if (x==t)return T;
    for (int i=head[x];i;i=ne[i]){
        head[x]=ne[i];
        if (d[a[i]]==d[x]+1&&c[i]){
            long long te=dfs(a[i],min(1ll*c[i],T));
            c[i]-=te;c[i^1]+=te;T-=te;w+=te;
            if (!T)break;
        }
    }
    if (!w)d[x]=-1;
    return w;
}
queue<int>q;
int bfs(){
    memset(d,-1,sizeof d);
    d[s]=0;
    q.push(s);
    while (!q.empty()){
        x=q.front();q.pop();
        for (int i=fi[x];i;i=ne[i])
            if (c[i]&&d[a[i]]==-1){
                d[a[i]]=d[x]+1;
                q.push(a[i]);
            }
    }
    for (i=1;i<=n;i++)head[i]=fi[i];
    return d[t]!=-1;
}
int main(){
    scanf("%d%d%d%d",&n,&m,&s,&t);k=1;
    for (i=1;i<=m;i++){
        scanf("%d%d%d",&x,&y,&z);
        add(x,y,z);
        add(y,x,0);
    }
    while (bfs())ans+=dfs(s,1ll<<40);
    printf("%lld\n",ans);
    return 0;
}

没有代码高亮差评

重装了一个插件现在有了

但是加强版就过不了。。还需优化。。


告别纷扰,去寻找生活的宝藏。