• poj 1273 Drainage Ditches(网络流基础)


    http://poj.org/problem?id=1273

    增广路算法。

    Ford_Fullkerson
      1 /*
      2 Author:Zhaofa Fang
      3 Lang:C++
      4 */
      5 #include <cstdio>
      6 #include <cstdlib>
      7 #include <iostream>
      8 #include <cmath>
      9 #include <cstring>
     10 #include <algorithm>
     11 #include <string>
     12 #include <utility>
     13 #include <vector>
     14 #include <queue>
     15 #include <stack>
     16 #include <map>
     17 #include <set>
     18 using namespace std;
     19 
     20 typedef long long ll;
     21 const int INF = 2147483647;
     22 
     23 struct Edge
     24 {
     25     int v,c,next;
     26 }edge[1005];
     27 int eh[505],pp;
     28 int pre[505];
     29 int G[505][505];
     30 void init()
     31 {
     32     pp = 0;
     33     memset(eh,-1,sizeof(eh));
     34     memset(G,0,sizeof(G));
     35 }
     36 void add(int u,int v,int c)
     37 {
     38     edge[pp].v=v;
     39     edge[pp].c=c;
     40     edge[pp].next=eh[u];
     41     eh[u]=pp++;
     42 }
     43 void addedge(int u,int v,int c)
     44 {
     45     add(u,v,c);
     46     G[u][v]+=c;
     47     add(v,u,0);
     48     G[v][u]+=0;
     49 }
     50 int bfs(int s,int t)
     51 {
     52     queue<int> q;
     53     bool vist[505];
     54     memset(vist,0,sizeof(vist));
     55     q.push(s);
     56     vist[s]=1;
     57     while(!q.empty())
     58     {
     59         int now=q.front();q.pop();
     60         for(int i=eh[now];i!=-1;i=edge[i].next)
     61         {
     62             int v=edge[i].v;
     63             if(G[now][v] > 0 && !vist[v])
     64             {
     65                 vist[v]=1;
     66                 pre[v]=now;
     67                 if(v == t)return 1;
     68                 q.push(v);
     69             }
     70         }
     71     }
     72     return 0;
     73 }
     74 int Ford_Fullkerson(int s,int t,int &F)
     75 {
     76     memset(pre,0,sizeof(pre));
     77     int min=INF;
     78     if(bfs(s,t) == 0)return 0;
     79     for(int i=t;i!=s;i=pre[i])
     80     {
     81         if(G[pre[i]][i] < min)min=G[pre[i]][i];
     82     }
     83     for(int i=t;i!=s;i=pre[i])
     84     {
     85         G[pre[i]][i] -= min;
     86         G[i][pre[i]] += min;
     87     }
     88     F += min;
     89     return 1;
     90 }
     91 int main()
     92 {
     93     #ifndef ONLINE_JUDGE
     94     freopen("in","r",stdin);
     95     #endif
     96     int m,n;
     97     while(~scanf("%d%d",&m,&n))
     98     {
     99         int u,c,v;
    100         init();
    101         while(m--)
    102         {
    103             scanf("%d%d%d",&u,&v,&c);
    104             addedge(u,v,c);
    105         }
    106         int F = 0;
    107         while(Ford_Fullkerson(1,n,F));
    108         cout<<F<<endl;
    109     }
    110     return 0;
    111 }

    sap_gap.

      1 /*
      2 Author:Zhaofa Fang
      3 Lang:C++
      4 */
      5 #include <cstdio>
      6 #include <cstdlib>
      7 #include <iostream>
      8 #include <cmath>
      9 #include <cstring>
     10 #include <algorithm>
     11 #include <string>
     12 #include <vector>
     13 #include <queue>
     14 #include <stack>
     15 #include <map>
     16 #include <set>
     17 using namespace std;
     18 
     19 typedef long long ll;
     20 const int INF = 2147483647;
     21 
     22 struct edge
     23 {
     24     int u,v;
     25     int cap,flow;
     26     int next;
     27 };
     28 int eh[505],tot;
     29 edge et[505<<1];
     30 void add(int u,int v,int cap,int flow)
     31 {
     32     edge E={u,v,cap,flow,eh[u]};
     33     et[tot]=E,eh[u]=tot++;
     34 }
     35 void addedge(int u,int v,int cap)
     36 {
     37     add(u,v,cap,0);add(v,u,0,0);
     38 }
     39 int cur[505],cnt[505],dist[505],pre[505];
     40 int low[505];
     41 int sap_gap(int s,int t,int n)
     42 {
     43     int u,v,now;
     44     memset(dist,0,sizeof(dist));
     45     memset(low,0,sizeof(low));
     46     for(u=0;u<=n;u++)cur[u] = eh[u];
     47     int flow=0;
     48     u = s;
     49     low[s] = INF;cnt[0] = n;
     50     while(dist[s] < n)
     51     {
     52         for(now = cur[u];now != -1;now = et[now].next)
     53             if(et[now].cap - et[now].flow && dist[u] == dist[v = et[now].v] + 1)break;
     54         if(now != -1)
     55         {
     56             cur[u] = now;pre[v] = now;
     57             low[v] = et[now].cap - et[now].flow;
     58             low[v] = min(low[v],low[u]);
     59             u = v;
     60             if(u == t)
     61             {
     62                 for(;u != s;u = et[pre[u]].u)
     63                 {
     64                     et[pre[u]].flow += low[t];
     65                     et[pre[u]^1].flow -= low[t];
     66                 }
     67                 flow += low[t];low[s] = INF;
     68             }
     69         }
     70         else
     71         {
     72             if(--cnt[dist[u]] == 0)break;
     73             dist[u] = n;cur[u] = eh[u];
     74             for(now = eh[u];now != -1;now = et[now].next)
     75                 if(et[now].cap-et[now].flow > 0 && dist[u] > dist[et[now].v] + 1)
     76                     dist[u] = dist[et[now].v] + 1;
     77                 cnt[dist[u]]++;
     78                 if(u != s)u = et[pre[u]].u;
     79         }
     80     }
     81     return flow;
     82 }
     83 int n,m;
     84 void init()
     85 {
     86     tot = 0;
     87     memset(eh,-1,sizeof(eh));
     88 }
     89 
     90 int main()
     91 {
     92     #ifndef ONLINE_JUDGE
     93     freopen("in","r",stdin);
     94     #endif
     95     int a,b,c;
     96     while(~scanf("%d%d",&m,&n))
     97     {
     98         init();
     99         for(int i=1;i<=m;i++)
    100         {
    101             scanf("%d%d%d",&a,&b,&c);
    102             addedge(a,b,c);
    103 
    104         }
    105         printf("%d\n",sap_gap(1,n,n));
    106     }
    107     return 0;
    108 }
    sap

    Dinic.O(V*V*E)

      1 Source Code
      2 
      3 Problem: 1273        User: qq6616323
      4 Memory: 716K        Time: 0MS
      5 Language: G++        Result: Accepted
      6 Source Code
      7 /*
      8  *Author:       Zhaofa Fang
      9  *Created time: 2013-07-13-10.25
     10  *Language:     C++
     11  */
     12 #include <cstdio>
     13 #include <cstdlib>
     14 #include <sstream>
     15 #include <iostream>
     16 #include <cmath>
     17 #include <cstring>
     18 #include <algorithm>
     19 #include <string>
     20 #include <utility>
     21 #include <vector>
     22 #include <queue>
     23 #include <map>
     24 #include <set>
     25 using namespace std;
     26 
     27 typedef long long ll;
     28 #define DEBUG(x) cout<< #x << ':' << x << endl
     29 #define FOR(i,s,t) for(int i = (s);i <= (t);i++)
     30 #define FORD(i,s,t) for(int i = (s);i >= (t);i--)
     31 #define REP(i,n) for(int i=0;i<(n);i++)
     32 #define REPD(i,n) for(int i=(n-1);i>=0;i--)
     33 #define PII pair<int,int>
     34 #define PB push_back
     35 #define MP make_pair
     36 #define ft first
     37 #define sd second
     38 #define lowbit(x) (x&(-x))
     39 #define INF (1<<30)
     40 #define eps 1e-8
     41 
     42 const int maxn = 505;
     43 const int maxm = 1010;
     44 struct Edge{
     45     int v,cap,flow,next;
     46 }edge[maxm];
     47 int eh[maxn],tot;
     48 int d[maxn];
     49 bool vist[maxn];
     50 
     51 void init(){
     52     tot = 0;
     53     memset(eh,-1,sizeof(eh));
     54 }
     55 void addedge(int u,int v,int c,int f){
     56     Edge e = {v,c,f,eh[u]};
     57     edge[tot] = e;
     58     eh[u] = tot ++;
     59 }
     60 void add(int u,int v,int c,int f){
     61     addedge(u,v,c,f);
     62     addedge(v,u,f,0);
     63 }
     64 
     65 bool BFS(int s,int t){
     66     memset(vist,0,sizeof(vist));
     67     queue<int>Q;
     68     Q.push(s);
     69     d[s] = 0;
     70     vist[s] = 1;
     71     while(!Q.empty()){
     72         int u = Q.front();
     73         Q.pop();
     74         for(int i=eh[u];i!=-1;i=edge[i].next){
     75             int v = edge[i].v;
     76             if(!vist[v] && edge[i].cap>edge[i].flow){
     77                  vist[v] = 1;
     78                  d[v] = d[u] + 1;
     79                  Q.push(v);
     80             }
     81         }
     82     }
     83     return vist[t];
     84 }
     85 int DFS(int u,int t,int avi){
     86     if(u == t || avi == 0)return avi;
     87     int flow = 0 , f;
     88     for(int i=eh[u];i!=-1;i=edge[i].next){
     89         int v = edge[i].v;
     90         if(d[u] + 1 == d[v] && (f=DFS(v,t,min(avi,edge[i].cap-edge[i].flow)))>0){
     91             edge[i].flow += f;
     92             edge[i^1].flow -= f;
     93             flow += f;
     94             avi -= f;
     95             if(avi == 0)break;
     96         }
     97     }
     98     return flow;
     99 }
    100 int maxFlow(int s,int t){
    101     int flow = 0;
    102     while(BFS(s,t)){
    103         flow += DFS(s,t,INF);
    104     }
    105     return flow;
    106 }
    107 int main(){
    108     //freopen("in","r",stdin);
    109     //freopen("out","w",stdout);
    110     int n,m;
    111     while(~scanf("%d%d",&n,&m)){
    112         int u,v,c;
    113         init();
    114         while(n --){
    115             scanf("%d%d%d",&u,&v,&c);
    116             add(u,v,c,0);
    117         }
    118         printf("%d\n",maxFlow(1,m));
    119     }
    120     return 0;
    121 }
    Dinic
    by Farmer
  • 相关阅读:
    第四周作业
    第三周作业
    2019学期第八周编程总结
    2019学期第七周编程总结
    2019学期第六周编程总结 .
    2019学期第五周编程总结 .
    2019学期第四周编程总结 .
    2019学期第四周编程总结
    2019学期第三周编程总结
    2019年春季学期第二周作业
  • 原文地址:https://www.cnblogs.com/fzf123/p/2697759.html
Copyright © 2020-2023  润新知