zoukankan      html  css  js  c++  java
  • 最大流问题的Ford-Fulkerson模板

    详细讲解:http://blog.csdn.net/smartxxyx/article/details/9293665

    下面贴上我的第一道最大流的题:

    hdu3549

     1 #include<stdio.h>
     2 #include<algorithm>
     3 #include<stdlib.h>
     4 #include<iostream>
     5 #include<string.h>
     6 #include<math.h>
     7 #include<vector>
     8 #include<map>
     9 #include<queue>
    10 struct pp
    11 {
    12     int x;
    13     int cap;
    14     int pre;
    15 };
    16 const int N=1e8;
    17 bool used[30];
    18 using namespace std;
    19 vector<pp>GG[30];
    20 void add(int from,int to,int vv)
    21 {   pp ss;
    22     ss.cap=vv;ss.x=to;ss.pre=GG[to].size();
    23     GG[from].push_back(ss);
    24     ss.cap=0;ss.x=from;ss.pre=GG[from].size()-1;
    25     GG[to].push_back(ss);
    26 }
    27 int dfs(int x,int y,int co)
    28 {
    29     if(x==y)
    30     {
    31         return co;
    32     }
    33     used[x]=true;
    34     int i,j;
    35     for(i=0;i<GG[x].size();i++)
    36     {  int cc ;
    37         pp &LL=GG[x][i];
    38         if(!used[LL.x]&&LL.cap>0)
    39         {
    40              cc=dfs(LL.x,y,min(co,LL.cap));
    41             if(cc>0)
    42             {
    43                 LL.cap-=cc;
    44                 GG[LL.x][LL.pre].cap+=cc;
    45                 return cc;
    46             }
    47         }
    48     }
    49     return 0;
    50 }
    51 int max_flow(int x,int t)
    52 {
    53     int flow=0;
    54     while(1)
    55     {memset(used,0,sizeof(used));
    56         int kk=dfs(x,t,N);
    57         if(kk==0)
    58         {
    59             return flow;
    60         }
    61         else flow+=kk;
    62     }
    63 
    64 }
    65 int main(void)
    66 {
    67     int i,j,k,p,q;
    68     scanf("%d",&k);
    69   
    70     for(i=1;i<=k;i++)
    71     { for(j=0;j<30;j++)
    72        GG[j].clear();
    73         scanf("%d %d",&p,&q);
    74         int x;int y;int n,m;
    75         for(j=0;j<q;j++)
    76         {
    77             scanf("%d %d %d",&x,&y,&n);
    78             add(x,y,n);
    79         }
    80         int M=max_flow(1,p);
    81         printf("Case %d: %d
    ",i,M);
    82     }
    83     return 0;
    84 }

     DINIC算法

      1 #include<stdio.h>
      2 #include<algorithm>
      3 #include<stdlib.h>
      4 #include<iostream>
      5 #include<string.h>
      6 #include<math.h>
      7 #include<vector>
      8 #include<map>
      9 #include<queue>
     10 using namespace std;
     11 struct node
     12 {
     13         int to;
     14         int cap;
     15         int rev;
     16 };
     17 int level[20];
     18 int iter[20];
     19 vector<node>vec[20];
     20 void add_edge(int from,int to,int cap )
     21 {
     22         vec[from].push_back(node {to,cap,vec[to].size()});
     23         vec[to].push_back(node {from,0,vec[from].size()-1});
     24 }
     25 void BFS(int s);
     26 int dfs(int id,int t,int f );
     27 int max_flow(int s,int t);
     28 const int N=1e9;
     29 int main(void)
     30 {
     31         int i,j,k,p,q;
     32         int x,y;
     33         scanf("%d",&k);
     34         int s;
     35         for(s=1; s<=k; s++)
     36         {
     37                 scanf("%d %d",&p,&q);
     38                 for(i=0;i<20;i++)
     39                 {
     40                     vec[i].clear();
     41                 }
     42                 for(i=0; i<q; i++)
     43                 {
     44                         int z;
     45                         scanf("%d %d %d",&x,&y,&z);
     46                         add_edge(x,y,z);
     47                 }
     48                 int sum=max_flow(1,p);
     49                 printf("Case %d: ",s);
     50                 printf("%d
    ",sum);
     51         }
     52         return 0;
     53 }
     54 void BFS(int s)
     55 {
     56         memset(level,-1,sizeof(level));
     57         queue<int>que;
     58         level[s]=0;
     59         que.push(s);
     60         while(!que.empty())
     61         {
     62                 int id=que.front();
     63                 que.pop();
     64                 for(int i=0; i<vec[id].size(); i++)
     65                 {
     66                         node x=vec[id][i];
     67                         if(level[x.to]<0&&x.cap>0)
     68                         {
     69                                 level[x.to]=level[id]+1;
     70                                 que.push(x.to);
     71                         }
     72                 }
     73         }
     74 }
     75 int dfs(int id,int t,int f )
     76 {
     77         if(t==id)return f;
     78         for(int &i=iter[id]; i<vec[id].size(); i++)
     79         {
     80                 node &vv=vec[id][i];
     81                 if(level[vv.to]>level[id]&&vv.cap>0)
     82                 {
     83                         int d=dfs(vv.to,t,min(f,vv.cap));
     84                         if(d>0)
     85                         {
     86                                 vv.cap-=d;
     87                                 vec[vv.to][vv.rev].cap+=d;
     88                                 return d;
     89                         }
     90                 }
     91         }
     92         return 0;
     93 }
     94 int max_flow(int s,int t)
     95 {
     96         int flow=0;
     97        for(;;)
     98         {
     99                 BFS(s);
    100                 if(level[t]<0)
    101                 {
    102                         return flow;
    103                 }
    104                 int f=0;
    105                 memset(iter,0,sizeof(iter));
    106                 while( (f=dfs(s,t,N))>0)
    107                 {
    108                 if(f==0)break;
    109                         flow+=f;
    110                 }
    111         }
    112 }
    油!油!you@
  • 相关阅读:
    关于AJAX与form表单提交数据的格式
    MongoDB
    Redis
    在django中使用django_debug_toolbar进行日志记录
    python第三方库,你要的这里都有
    Django之用户认证auth模块
    Django中常用命令
    form表单钩子,局部钩子和全局钩子
    当我开始爱自己
    FOR YOU
  • 原文地址:https://www.cnblogs.com/zzuli2sjy/p/5202414.html
Copyright © 2011-2022 走看看