• POJ 1273,HDU 1532 Drainage Ditches(最大流)


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

    使用网络流最大流中的DINIC算法解决

     1 #include<stdio.h>
     2 #include<string.h>
     3 #define point_MAX 10000
     4 #define edge_MAX 100000
     5 #define INF_MAX 999999999
     6 struct EDGE
     7 {
     8     int to;/*指向的点*/
     9     int next;/*指向的下一条邻边*/
    10     int w;/*权值*/
    11 }edge[edge_MAX];
    12 int len;/*边的数量*/
    13 int point[point_MAX];
    14 int Vertex,Edge;
    15 int d[point_MAX];
    16 void init()/*初始化*/
    17 {
    18     len=0;
    19     memset(point,0,sizeof(point));
    20 }
    21 int add_edge(int a,int b,int w)/*添加由a指向b的权值为w的边*/
    22 {
    23     len++;
    24     edge[len].w=w;
    25     edge[len].to=b;
    26     edge[len].next=point[a];
    27     point[a]=len;
    28     return 0;/*无重边,插入*/
    29 }
    30 int bfs(int s)
    31 {
    32     int q[point_MAX],front=0,rear=1,j,t,i;
    33     q[0]=s;
    34     memset(d,-1,sizeof(d));/**/
    35     d[s]=0;
    36     while(front<rear)
    37     {
    38        t=q[front++];
    39          for(j=point[t];j;j=edge[j].next)
    40          {
    41             if(d[edge[j].to]==-1&&edge[j].w>0)
    42             {
    43              d[edge[j].to]=d[t]+1;
    44            q[rear++]=edge[j].to;
    45         }
    46          }
    47     }
    48     if(d[Vertex]>=0)
    49        return 1;
    50     return 0;
    51 }
    52 long long min(long long a,long long b)
    53 {
    54     return a<b?a:b;
    55 }
    56 long long dinic(int t,long long sum)
    57 {
    58     int i,os,j;
    59     long long a;
    60     if(t==Vertex)
    61       return sum;
    62     os=sum;
    63     for(i=point[t];i&&sum;i=edge[i].next)
    64     {
    65        if(d[edge[i].to]==d[t]+1&&edge[i].w>0)
    66        {
    67            a=dinic(edge[i].to,min(sum,edge[i].w));
    68            edge[i].w-=a;
    69            for(j=point[edge[i].to];edge[j].to!=t;j=edge[j].next);
    70            edge[j].w+=a;
    71            sum-=a;
    72        }
    73     }
    74     return os-sum;
    75 }
    76 long long DINIC(int s)
    77 {
    78      long long ans=0;
    79      while(bfs(s))
    80        ans+=dinic(s,INF_MAX);
    81      return ans;
    82 }
    83 
    84 int main()
    85 {
    86      int i,j,x,y,w;
    87      while(scanf("%d%d",&Edge,&Vertex)!=EOF)
    88      {
    89         init();
    90         for(i=0;i<Edge;i++)
    91         {
    92            scanf("%d%d%d",&x,&y,&w);
    93            add_edge(x,y,w);
    94            add_edge(y,x,0);
    95         }
    96         printf("%lld
    ",DINIC(1));
    97      }
    98      return 0;
    99 }
    View Code
  • 相关阅读:
    [spring] SpEL
    [spring学习2] 装配
    [spring] proxyMode
    [spring] @PropertySource
    [一些问题] 在vscode中添加jar库
    [spring] ApplicationContext相关问题
    gradle 打包
    [spring学习1] IoC容器
    spring快速开始
    准备要写的笔记备忘录
  • 原文地址:https://www.cnblogs.com/huzhenbo113/p/3681282.html
Copyright © 2020-2023  润新知