0pts求助!,蒟蒻实在不知道这份网络流何处有问题,求大佬指点
查看原帖
0pts求助!,蒟蒻实在不知道这份网络流何处有问题,求大佬指点
393674
jixiang楼主2022/3/31 18:14
#include<bits/stdc++.h>
#define rep(i,j,k) for(int i = (j) ; i <= (k) ; i++)
#define fdow (i,j,k) for (int  i = (j) ; i >= (k) ; i--)
#define debug puts("Debeg!!!!! wake up !!!")
#define Mset(a,v) memset(a,v,sizeof (a))
#define Mcpy(a,v) memcpy(a,v,sizeof (a))
#define mrep(i,j) for(int i=(h[j]);~i;i=ne[i])

using namespace std;
typedef long long ll;
typedef pair<int,int> pii;

const int N = 1000+9;
const int M = 4e5+9;
const ll INF= 1e18+9;
int h[N], e[M], ne[M], idx;
int cur[N];
ll w[M];
ll d[N],f[M];
bool st[N];
int n,m,S,T;

struct edge
{
    int from,to;
    ll val;
}Q[M];

template <typename T> void inline read(T &x)
{
    x= 0 ; bool f= 0; char ch  = getchar();
    while (ch < '0' || ch > '9') {if(ch == '-')f= 1; ch = getchar();}
    while (ch <='9' && ch >= '0') {x= (x<<1)+ (x<<3) + ch - '0'; ch = getchar();}
    if(f)x*=-1;
}

template <typename T> inline void wri(T x)
{
    if(x<0)putchar('-'), x= -x;
    if(x>9)wri(x/10);
    putchar(x%10 +'0');
}


void add_gra(int a,int b,ll c)
{
    e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
    e[idx] = a, w[idx] = c, ne[idx] = h[b], h[b] = idx ++ ;
}

void add_flow(int a, int b, ll c)
{
    e[idx] = b, f[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
    e[idx] = a, f[idx] = 0, ne[idx] = h[b], h[b] = idx ++ ;
}

bool bfs()
{
    memset(d,-1,sizeof d);
    queue<int>q;
    q.push(S); d[S]=0; cur[S]=h[S];
    while (q.size())
    {
        int top = q.front();
        q.pop();
        for(int i=h[top];~i;i=ne[i])
        {
            int v= e[i];
            if(d[v]==-1 && f[i])
            {
                d[v]=d[top]+1;
                cur[v]=h[v];
                if(v==T)return 1;
                q.push(v);
            }
        }
    }
    return 0;
}

ll find(int u,ll lim)
{
    ll flow = 0;
    if(u==T)return lim;
    for (int i=cur[u];~i&&flow<lim;i=ne[i])
    {
        cur[u]=i;
        int v=e[i];
        if(d[v]==d[u]+1&&f[i])
        {
            ll tx=find(v,min(f[i],lim-flow));
            if(!tx)d[v]=-1;
            f[i^1]+=tx; f[i]-=tx; flow += tx;
        }
    }
    return flow;
}

void spfa()
{
    queue<int> q;
    rep(i,1,n) d[i]=INF;
    q.push(S); d[S]=0; st[S]=1;
    while(q.size())
    {
        int top = q.front();
        q.pop();
        st[top]=0;
        mrep(i,top)
        {
            int v=e[i];
            if( d[v] > d[top]+w[i])
            {
                d[v]=d[top]+w[i];
                if(!st[v]) q.push(v),st[v]=1;
            }
        }
    }
}


ll Dinic()
{
    ll res= 0;
    ll flow;
    while (bfs()) while (flow=find(S,LONG_LONG_MAX))res+=flow;
    return res;
}

int main()
{
    Mset(h,-1);
    read(n); read(m);

    S = 1;
    T = n;

    rep(i,1,m)
    {
        int u,v;
        ll dis;
        read(u); read(v); read(dis);
        add_gra(u,v,dis);
        Q[i]={u,v,dis};
    }
    spfa();

    Mset(h,-1);
    idx = 0;
    rep(i,1,m)
    {
        int u,v;
        ll dis;
        u=Q[i].from; v=Q[i].to; dis=Q[i].val;
        if(d[u]+dis==d[v])
        {
            add_flow(u+n,v,INF);
            add_flow(v+n,u,INF);
        }
    }

    rep(i,1,n)
    {
        ll x;
        read(x);
        if(i!=1 && i!=n)add_flow(i,i+n,x);
        else add_flow(i,i+n,INF);
    }

    S = 1;
    T = n+n;
    printf("%lld",Dinic());

}

2022/3/31 18:14
加载中...