• Hdu Drainage Ditches


    View Code
      1 /*
      2 http://acm.hdu.edu.cn/webcontest/contest_showproblem.php?pid=1001&ojid=0&cid=4456&hide=0
      3 
      4 hdu  Drainage Ditches 
      5 */
      6 #include <iostream>
      7 #include<cstdio>
      8 #include<cstring>
      9 #include<vector>
     10 #include<queue>
     11 #include<algorithm>
     12 using namespace std;
     13 #define min(a,b) ((a)<(b))?(a):(b)
     14 #define max(a,b) ((a)>(b))?(a):(b)
     15 #define MAXN 200
     16 #define MAXM 500
     17 #define INF 0x3f3f3f3f
     18 //链式前向星
     19 struct enode
     20 {
     21     int t;
     22     int w;                //权值
     23     int c;                //流量
     24 //  int cost;
     25 //    int pre;            //前向指针
     26     int next;
     27 };
     28 struct lstar
     29 {
     30     struct enode e[MAXM];
     31     int box[MAXN],ecnt;
     32     //int etail[MAXN];        //尾部
     33     void init()
     34     {
     35         ecnt=0;
     36         memset(box,-1,sizeof(box));
     37     //    memset(etail,-1,sizeof(etail));        //初始化尾部
     38     }
     39     void ins(int f,int t,int c)                   //简单
     40     {
     41         e[ecnt].t=t;
     42     //    e[ecnt].pre=-1;
     43         e[ecnt].next=box[f];
     44         e[ecnt].c=c;
     45         box[f]=ecnt++;
     46     }
     47     void addedge(int f,int t,int c)            //流量重载
     48     {
     49         e[ecnt].next=box[f];
     50         e[ecnt].t=t;
     51         e[ecnt].c=c;
     52         box[f]=ecnt++;
     53         e[ecnt].next=box[t];
     54         e[ecnt].t=f;
     55         e[ecnt].c=0;
     56         box[t]=ecnt++;
     57     }
     58     void ins1(int f,int t,int w)             //权值重载
     59     {
     60         e[ecnt].t=t;
     61         e[ecnt].w=w;
     62         e[ecnt].next=box[f];
     63         box[f]=ecnt++;
     64     }
     65 
     66 };
     67 
     68 int sap(int s,int t,lstar G,int N)//最大流问题
     69 {
     70     int gap[MAXN],lvl[MAXN],cur[MAXN],pre[MAXN];
     71     int curflow,ans=0,u,tmp,neck,i;
     72     memset(lvl,0,sizeof(lvl));
     73     memset(gap,0,sizeof(gap));
     74     memset(pre,-1,sizeof(pre));
     75     for(i=0;i<N;i++)
     76         cur[i]=G.box[i];
     77     gap[0]=N;
     78     u=s;
     79     while(lvl[s]<N)
     80     {
     81         if(u==t)
     82         {
     83             curflow=INF;
     84             for(i=s;i!=t;i=G.e[cur[i]].t)
     85             {
     86                 if(curflow>G.e[cur[i]].c)
     87                 {
     88                     neck=i;
     89                     curflow=G.e[cur[i]].c;
     90                 }
     91             }
     92             for(i=s;i!=t;i=G.e[cur[i]].t)
     93             {
     94                 tmp=cur[i];
     95                 G.e[tmp].c-=curflow;
     96                 G.e[tmp^1].c+=curflow;
     97             }
     98             ans+=curflow;
     99             u=neck;
    100         }
    101         for(i=cur[u];i!=-1;i=G.e[i].next)
    102             if(G.e[i].c && lvl[u]==lvl[G.e[i].t]+1)
    103                 break;
    104         if(i!=-1)
    105         {
    106             cur[u]=i;
    107             pre[G.e[i].t]=u;
    108             u=G.e[i].t;
    109         }
    110         else
    111         {
    112             if(--gap[lvl[u]]==0)
    113                 break;
    114              cur[u]=G.box[u];
    115             for(tmp=N,i=G.box[u];i!=-1;i=G.e[i].next)
    116                 if(G.e[i].c)
    117                     tmp=min(tmp,lvl[G.e[i].t]);
    118             lvl[u]=tmp+1;
    119             gap[lvl[u]]++;
    120             if(u!=s)
    121                 u=pre[u];
    122         }
    123     }
    124     return ans;
    125 }
    126 int main()
    127 {
    128       int m,n;
    129       lstar  s;
    130         while(cin>>n>>m)
    131         {
    132             int a,b,cost;
    133            // memset(map,0,sizeof(map));
    134            s.init();
    135            for(int i=0;i<n;i++)
    136             {
    137                cin>>a>>b>>cost;
    138                s.addedge(a-1,b-1,cost);
    139             }//参数含义:源点 汇点 网络结点数量
    140             //printf("####\n");
    141           /*  for(int i=1;i<=n;i++)
    142             {
    143                 for(int k=s.box[i];k!=-1;k=s.e[k].next)
    144                 cout<<i<< " " <<s.e[k].t<< " " <<s.e[k].c<<endl;
    145             }//*/
    146             cout<<sap(0,m-1,s,m)<<endl;//最大流问题
    147         }
    148     return 0;
    149 }

    图论 基础 求最大流

    建图  链式前向星  注意构建边结构 存容量 C

    SAP 求最大流

  • 相关阅读:
    原码/反码/补码详解
    树剖LCA讲解
    code vs 2166 Bessie的体重问题
    code vs 3376 符号三角形
    洛谷 P3078 [USACO13MAR]扑克牌型Poker Hands
    vjudge B
    POJ 1013 Counterfeit Dollar
    POJ 1008 Maya Calendar
    POJ 1006 Biorhythms
    POJ 3252 Round Numbers
  • 原文地址:https://www.cnblogs.com/someonelikeyou/p/3029730.html
Copyright © 2020-2023  润新知