zoukankan      html  css  js  c++  java
  • [bzoj2055]80人环游世界[网络流,上下界网络流]

    手动画了整张图,,算是搞懂了吧,,

      1 #include <bits/stdc++.h>
      2 
      3 #define    INF    0x3f3f3f3f
      4 
      5 using namespace std;
      6 
      7 template<const int _n,const int _m>
      8 struct    Edge
      9 {
     10     struct Edge_base { int    to,next,w,c; }e[_m]; int    cnt,p[_n];
     11     Edge() { clear(); }
     12     void    clear() { cnt=1,memset(p,0,sizeof(p)); }
     13     void    insert(const int x,const int y,const int z,const int zz)
     14     { e[++cnt].to=y; e[cnt].next=p[x]; e[cnt].w=z; e[cnt].c=zz; p[x]=cnt; return ; }
     15     void    link(const int x,const int y,const int z,const int zz)
     16     { insert(x,y,z,zz); insert(y,x,0,-zz); }
     17     int    start(const int x) { return p[x]; }
     18     Edge_base& operator[](const int x) { return e[x]; }
     19 };
     20 
     21 int    n,m,Dis[210],Cost;
     22 int    cur[210],SSS,TTT,SS,TT;
     23 bool    visited[210];
     24 Edge<210,510000>e;
     25 
     26 bool    Spfa(const int S)
     27 {
     28     int    i,t,temp;
     29     queue<int>    Q;
     30     memset(Dis,0x3f,sizeof(Dis));
     31     Dis[S]=0;
     32     visited[S]=true;
     33     Q.push(S);
     34     while(!Q.empty())
     35     {
     36         t=Q.front(),Q.pop();
     37         visited[t]=false;
     38         for(i=e.start(t);i;i=e[i].next)
     39         {
     40             temp=e[i].to;
     41             if(e[i].w && Dis[t]+e[i].c<Dis[temp])
     42             {
     43                 Dis[temp]=Dis[t]+e[i].c;
     44                 if(!visited[temp])
     45                 {
     46                     visited[temp]=true;
     47                     Q.push(temp);
     48                 }
     49             }
     50         }
     51     }
     52     return Dis[TTT]!=0x3f3f3f3f;
     53 }
     54 
     55 int    Dfs(const int S,const int bk)
     56 {
     57     if(S==TTT)return bk;
     58     visited[S]=true;
     59     int    rest=bk;
     60     for(int &i=cur[S];i;i=e[i].next)
     61     {
     62         if(!visited[e[i].to] && Dis[S]+e[i].c==Dis[e[i].to] && e[i].w)
     63         {
     64             int    flow=Dfs(e[i].to,min(rest,e[i].w));
     65             Cost+=flow*e[i].c;
     66             e[i].w-=flow;
     67             e[i^1].w+=flow;
     68             if((rest-=flow)<=0)break;
     69         }
     70     }
     71     if(bk==rest)Dis[S]=0x3f3f3f3f;
     72     visited[S]=false;
     73     return bk-rest;
     74 }
     75 
     76 int    Zkw()
     77 {
     78     int    Flow=0;
     79     while(Spfa(SSS))
     80     {
     81         memcpy(cur,e.p,sizeof(cur));
     82         Flow+=Dfs(SSS,0x3f3f3f3f);
     83     }
     84     return Cost;
     85 }
     86 
     87 int main()
     88 {
     89     int    i,j,a,x;
     90 
     91     scanf("%d%d",&n,&m);
     92 
     93     SS=n<<1|1,TT=SS+1,SSS=TT+1,TTT=SSS+1;
     94     for(i=1;i<=n;++i)
     95     {
     96         scanf("%d",&a);
     97         e.link(SSS,i+n,a,0);
     98         e.link(i,TTT,a,0);
     99         e.link(i+n,TT,INF,0);
    100         e.link(SS,i,INF,0);
    101     }
    102     
    103     for(i=1;i<=n;++i)for(j=i+1;j<=n;++j)
    104     {
    105         scanf("%d",&x);
    106         if(x==-1)continue;
    107         e.link(i+n,j,INF,x);
    108     }
    109 
    110     e.link(TT,SS,m,0);
    111 
    112     printf("%d
    ",Zkw());
    113     return 0;
    114 }
  • 相关阅读:
    最大公约数
    面向对象(jianli)(游客买门票)
    String
    ATM模拟取款
    常用快捷键归纳
    购物清单
    jxls使用模版导出Excel
    IText 生成pdf,处理table cell列跨页缺失的问题
    Java使用IText(VM模版)导出PDF
    js ajax post提交 ie和火狐、谷歌提交的编码不一致,导致中文乱码
  • 原文地址:https://www.cnblogs.com/Gster/p/5090535.html
Copyright © 2011-2022 走看看