zoukankan      html  css  js  c++  java
  • POJ 1273 Drainage Ditches 一般增广路算法,网络流

    看到Ci最大可以到10 000 000,N<=200,M<=200,我以为用这个算法会超时,据说该算法的复杂度是N*M*C,C为最大流量值。

    但是显然没超,可能是数据弱神马的,不知道

    没什么思路说的,就是裸的网络最大流,我的代码和上一个题 pigs(麦克卖猪)的代码基本上相同,下面贴代码:

    View Code
     1 #include <cstdio>
     2 #include <cstring>
     3 #define MAXN 205
     4 #define MAXM 205
     5 #define INF 300000000
     6 struct Arc
     7 {
     8     int c,f;
     9 } edge[MAXN][MAXN];
    10 int n,m;
    11 void init()
    12 {
    13     int i;
    14     memset(edge,0,sizeof(edge));
    15     for(i =0; i < m; ++i)
    16     {
    17         int u,v,c;
    18         scanf("%d%d%d",&u,&v,&c);
    19         edge[u][v].c += c;
    20     }
    21 }
    22 void Ford()
    23 {
    24     int prev[MAXN];
    25     int alpha[MAXN];
    26     int queue[MAXN];
    27     int i,j;
    28     while(1)
    29     {
    30         int front=0,tail=0;
    31         memset(prev,0xff,sizeof(prev));
    32         queue[tail++] = 1;
    33         alpha[1] = INF;
    34         prev[1] = -2;
    35         while(front != tail && prev[n] == -1)
    36         {
    37             int v = queue[front++];
    38             for(i = 1; i <= n; i++)
    39             {
    40                 int tmp;
    41                 if(prev[i] == -1 && (tmp = edge[v][i].c-edge[v][i].f))
    42                 {
    43                     prev[i] = v;
    44                     queue[tail++] = i;
    45                     alpha[i] = alpha[v] < tmp ? alpha[v]:tmp;
    46                 }
    47             }
    48         }
    49         if(prev[n] == -1) break;
    50         for(i = prev[n],j = n; i != -2; j = i, i = prev[i])
    51         {
    52             edge[i][j].f += alpha[n];
    53             edge[j][i].f = -edge[i][j].f;
    54         }
    55     }
    56     int p=0;
    57     for(i=1; i<n; i++)
    58         p += edge[i][n].f;
    59     printf("%d\n",p);
    60 }
    61 int main()
    62 {
    63 //    freopen("in.cpp","r",stdin);
    64     while(~scanf("%d%d",&m,&n))
    65     {
    66         init();
    67         Ford();
    68     }
    69     return 0;
    70 }
  • 相关阅读:
    JavaScript中Null和Undefined的区别
    javascript中的计算题
    数组去重
    javascript面向对象中继承实现的几种方式
    数列求值 题解
    首字母变大写 题解
    发工资咯:) 题解
    绝对值排序 题解
    数列有序 题解
    母牛的故事 题解
  • 原文地址:https://www.cnblogs.com/allh123/p/3008777.html
Copyright © 2011-2022 走看看