zoukankan      html  css  js  c++  java
  • hdu

    http://acm.hdu.edu.cn/showproblem.php?pid=3549

    Ford-Fulkerson算法.

    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <vector>
    #include <cstring>
    #include <string>
    #include <algorithm>
    #include <string>
    #include <set>
    #include <functional>
    #include <numeric>
    #include <sstream>
    #include <stack>
    #include <map>
    #include <queue>
    #pragma comment(linker, "/STACK:102400000,102400000")
    #define CL(arr, val)    memset(arr, val, sizeof(arr))
    
    #define ll long long
    #define inf 0x7f7f7f7f
    #define lc l,m,rt<<1
    #define rc m + 1,r,rt<<1|1
    #define pi acos(-1.0)
    
    #define L(x)    (x) << 1
    #define R(x)    (x) << 1 | 1
    #define MID(l, r)   (l + r) >> 1
    #define Min(x, y)   (x) < (y) ? (x) : (y)
    #define Max(x, y)   (x) < (y) ? (y) : (x)
    #define E(x)        (1 << (x))
    #define iabs(x)     (x) < 0 ? -(x) : (x)
    #define OUT(x)  printf("%I64d
    ", x)
    #define lowbit(x)   (x)&(-x)
    #define Read()  freopen("a.txt", "r", stdin)
    #define Write() freopen("b.txt", "w", stdout);
    #define maxn 1010
    #define maxv 1010
    #define mod 1000000000
    using namespace std;
    
    struct edge
    {
        int to,cap,rev;
        edge(){}
        edge(int x,int y,int z)
        {
            to=x;
            cap=y;
            rev=z;
        }
    };
    
    vector<edge>G[maxv];
    bool used[maxv];
    
    void add_edge(int from,int to,int cap)
    {
        G[from].push_back((edge){to,cap,G[to].size()});
        G[to].push_back((edge){from,0,G[from].size()-1});
    }
    
    int dfs(int v,int t,int f)
    {
        if(v==t) return f;
        used[v]=true;
        for(int i=0;i<G[v].size();i++)
        {
            edge &e=G[v][i];
            if(!used[e.to]&&e.cap>0)
            {
                int d=dfs(e.to,t,min(f,e.cap));
                if(d>0)
                {
                    e.cap-=d;
                    G[e.to][e.rev].cap+=d;
                 //   printf("%d %d
    ",e.to,e.rev);
                    return d;
                }
            }
        }
        return 0;
    }
    
    int max_flow(int s,int t)
    {
        int flow=0;
        for(;;)
        {
            memset(used,0,sizeof(used));
            int f=dfs(s,t,inf);
            if(f==0) return flow;
            flow+=f;
        }
    }
    int main()
    {
        //freopen("a.txt","r",stdin);
        int t,n,m,a,b,c,j=1;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d",&n,&m);
            for(int i=0;i<=n;i++)
                G[i].clear();
            for(int i=0;i<m;i++)
            {
                scanf("%d%d%d",&a,&b,&c);
                add_edge(a,b,c);
            }
            printf("Case %d: %d
    ",j++,max_flow(1,n));
        }
        return 0;
    }

    Dinic算法:(动态邻接表) 

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cmath>
      4 #include <vector>
      5 #include <cstring>
      6 #include <string>
      7 #include <algorithm>
      8 #include <string>
      9 #include <set>
     10 #include <functional>
     11 #include <numeric>
     12 #include <sstream>
     13 #include <stack>
     14 #include <map>
     15 #include <queue>
     16 #pragma comment(linker, "/STACK:102400000,102400000")
     17 #define CL(arr, val)    memset(arr, val, sizeof(arr))
     18 
     19 #define ll long long
     20 #define inf 0x7f7f7f7f
     21 #define lc l,m,rt<<1
     22 #define rc m + 1,r,rt<<1|1
     23 #define pi acos(-1.0)
     24 
     25 #define L(x)    (x) << 1
     26 #define R(x)    (x) << 1 | 1
     27 #define MID(l, r)   (l + r) >> 1
     28 #define Min(x, y)   (x) < (y) ? (x) : (y)
     29 #define Max(x, y)   (x) < (y) ? (y) : (x)
     30 #define E(x)        (1 << (x))
     31 #define iabs(x)     (x) < 0 ? -(x) : (x)
     32 #define OUT(x)  printf("%I64d
    ", x)
     33 #define lowbit(x)   (x)&(-x)
     34 #define Read()  freopen("a.txt", "r", stdin)
     35 #define Write() freopen("b.txt", "w", stdout);
     36 #define maxn 1010
     37 #define maxv 1010
     38 #define mod 1000000000
     39 using namespace std;
     40 
     41 struct edge
     42 {
     43     int to,cap,rev;
     44     edge(){}
     45     edge(int x,int y,int z)
     46     {
     47         to=x;
     48         cap=y;
     49         rev=z;
     50     }
     51 };
     52 
     53 vector<edge>G[maxv];
     54 int level[maxv];
     55 int iter[maxv];
     56 
     57 void add_edge(int from,int to,int cap)
     58 {
     59     G[from].push_back((edge){to,cap,G[to].size()});
     60     G[to].push_back((edge){from,0,G[from].size()-1});
     61 }
     62 
     63 void bfs(int s)
     64 {
     65     memset(level,-1,sizeof(level));
     66     queue<int>que;
     67     level[s]=0;
     68     que.push(s);
     69     while(!que.empty())
     70     {
     71         int v=que.front();que.pop();
     72         for(int i=0;i<G[v].size();i++)
     73         {
     74             edge &e=G[v][i];
     75             if(e.cap>0&&level[e.to]<0)
     76             {
     77                 level[e.to]=level[v]+1;
     78                 que.push(e.to);
     79             }
     80         }
     81     }
     82 }
     83 int dfs(int v,int t,int f)
     84 {
     85     if(v==t) return f;
     86     for(int &i=iter[v];i<G[v].size();i++)
     87     {
     88         edge &e=G[v][i];
     89         if(e.cap>0&&level[v]<level[e.to])
     90         {
     91             int d=dfs(e.to,t,min(f,e.cap));
     92             if(d>0)
     93             {
     94                 e.cap-=d;
     95                 G[e.to][e.rev].cap+=d;
     96               //  printf("%d %d %d
    ",e.to,e.rev,G[e.to][e.rev]);
     97                 return d;
     98             }
     99         }
    100     }
    101     return 0;
    102 }
    103 
    104 int max_flow(int s,int t)
    105 {
    106     int flow=0;
    107     for(;;)
    108     {
    109         bfs(s);
    110         if(level[t]<0) return flow;
    111         memset(iter,0,sizeof(iter));
    112         int f;
    113         while((f=dfs(s,t,inf))>0)
    114         flow+=f;
    115     }
    116 }
    117 int main()
    118 {
    119     //freopen("a.txt","r",stdin);
    120     int t,n,m,a,b,c,j=1;
    121     scanf("%d",&t);
    122     while(t--)
    123     {
    124         scanf("%d%d",&n,&m);
    125         for(int i=0;i<=n;i++)
    126             G[i].clear();
    127         for(int i=0;i<m;i++)
    128         {
    129             scanf("%d%d%d",&a,&b,&c);
    130             add_edge(a,b,c);
    131         }
    132         printf("Case %d: %d
    ",j++,max_flow(1,n));
    133     }
    134     return 0;
    135 }
  • 相关阅读:
    缓冲区溢出漏洞实验
    编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能
    预备作业01
    20155335俞昆的第2次随笔
    20155335俞昆
    团队博客
    小组项目第三周(20145101、20145102、20145124、20145203)
    小组项目第二周(20145101、20145102、20145124、20145203)
    小组项目第一周(20145101、20145102、20145124、20145203)
    项目总结
  • 原文地址:https://www.cnblogs.com/nowandforever/p/4565224.html
Copyright © 2011-2022 走看看