zoukankan      html  css  js  c++  java
  • P2469 [SDOI2010]星际竞速(费用流)

    P2469 [SDOI2010]星际竞速

    最小路径覆盖问题

    每个星球必须恰好去一次,而每次高速航行都是从一个星球到另一个星球。

    那么高速航行的起点可以保证被去过

    高速航行和空间跳跃可以是互相独立

    将每个点$i$拆成$i_1,i_2$,套路地连边

    $link(S,i_1,1,0)$

    $link(S,i_2,1,val_i)$

    $link(i_2,T,1,0)$

    对于每条边$(u,v,w)$:

    $link(u_1,v_2,w)$

    蓝后跑一遍费用流,费用流会覆盖所有路径$(i_2,T)$

    满流的最小代价即为答案

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    using namespace std;
    #define N 2005
    #define M 100005
    int n,m,S,T,d[N],a[N],p[N],tC;
    queue <int> h; bool inh[N];
    int cnt=1,hd[N],nxt[M],ed[N],poi[M],val[M],cst[M];
    inline void adde(int x,int y,int v1,int v2){
        nxt[ed[x]]=++cnt, hd[x]=hd[x]?hd[x]:cnt,
        ed[x]=cnt, poi[cnt]=y, val[cnt]=v1,cst[cnt]=v2;
    }
    inline void link(int x,int y,int v1,int v2){adde(x,y,v1,v2),adde(y,x,0,-v2);}
    bool bfs(){
        memset(d,127,sizeof(d)); int inf=d[0];
        h.push(S); d[S]=0; a[S]=inf; inh[S]=1;
        while(!h.empty()){
            int x=h.front(); h.pop(); inh[x]=0;
            for(int i=hd[x];i;i=nxt[i]){
                int to=poi[i];
                if(val[i]>0&&d[to]>d[x]+cst[i]){
                    d[to]=d[x]+cst[i]; p[to]=i;
                    a[to]=min(a[x],val[i]);
                    if(!inh[to]) inh[to]=1,h.push(to);
                }
            }
        }if(d[T]==inf) return 0;
        tC+=a[T]*d[T];
        for(int i=T;i!=S;i=poi[p[i]^1])
            val[p[i]]-=a[T],val[p[i]^1]+=a[T];
        return 1;
    }
    int main(){
        scanf("%d%d",&n,&m); int u,v,w;
        S=n*2+1; T=S+1;
        for(int i=1;i<=n;++i){
            link(S,i,1,0);
            link(i+n,T,1,0);
            scanf("%d",&w);
            link(S,i+n,1,w);
        }
        for(int i=1;i<=m;++i){
            scanf("%d%d%d",&u,&v,&w);
            if(u>v) swap(u,v);
            link(u,v+n,1,w);
        }while(bfs());
        printf("%d",tC);
        return 0;
    }

     

  • 相关阅读:
    HDU
    01字典树模板
    扩展欧几里得和乘法逆元
    HDOJ-1156 Brownie Points II 线段树/树状数组(模板)
    CF-825E Minimal Labels 反向拓扑排序
    CF-831D Office Keys 思维题
    RMQ 解决区间查询问题
    hdu 5073 有坑+方差贪心
    hdu 5074 相邻数和最大dp
    hdu 5078 水题
  • 原文地址:https://www.cnblogs.com/kafuuchino/p/10800399.html
Copyright © 2011-2022 走看看