• hdu------(3549)Flow Problem(最大流(水体))


    Flow Problem

    Time Limit: 5000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
    Total Submission(s): 8203    Accepted Submission(s): 3817


    Problem Description
    Network flow is a well-known difficult problem for ACMers. Given a graph, your task is to find out the maximum flow for the weighted directed graph.
     
    Input
    The first line of input contains an integer T, denoting the number of test cases.
    For each test case, the first line contains two integers N and M, denoting the number of vertexes and edges in the graph. (2 <= N <= 15, 0 <= M <= 1000)
    Next M lines, each line contains three integers X, Y and C, there is an edge from X to Y and the capacity of it is C. (1 <= X, Y <= N, 1 <= C <= 1000)
     
    Output
    For each test cases, you should output the maximum flow from source 1 to sink N.
     
    Sample Input
    2 3 2 1 2 1 2 3 1 3 3 1 2 1 2 3 1 1 3 1
     
    Sample Output
    Case 1: 1 Case 2: 2
     
    Author
    HyperHexagon
     
    Source
     
    代码:
     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<queue>
     5 using namespace std;
     6 const int inf=0x3f3f3f3f;
     7 int mat[30][30];
     8 int dist[31];
     9 int n,m;
    10 int min(int a,int b)
    11 {
    12 return a<b?a:b;
    13 }
    14 bool bfs(int st,int to){
    15     memset(dist,-1,sizeof(dist));
    16     queue<int>q;
    17     q.push(st);
    18     dist[st]=0;
    19     int t;
    20     while(!q.empty()){
    21        t=q.front();
    22        q.pop();
    23     for(int i=1;i<=n;i++){
    24         if(dist[i]<0&&mat[t][i]>0){
    25             dist[i]=dist[t]+1;
    26             if(i==to)return 1;
    27             q.push(i);
    28         }
    29     }
    30     }
    31   return 0;
    32 }
    33 int dfs(int st,int to,int flow)
    34 {
    35     int tem;
    36     if(st==to||flow==0) return flow;
    37     for(int i=1;i<=n;i++){
    38       if((dist[i]==dist[st]+1)&&mat[st][i]>0&&(tem=dfs(i,to,min(mat[st][i],flow))))
    39       {
    40           mat[st][i]-=tem;
    41           mat[i][st]+=tem;
    42           return tem;
    43       }
    44     }
    45   return 0;
    46 }
    47 int Dinic(int st,int en)
    48 {
    49     int ans=0;
    50     while(bfs(st,en))
    51         ans+=dfs(st,en,inf);
    52    return ans;
    53 }
    54 int main(){
    55   int cas,i,a,b,c;
    56   scanf("%d",&cas);
    57   for(i=1;i<=cas;i++){
    58       scanf("%d%d",&n,&m);
    59       memset(mat,0,sizeof(mat));
    60      while(m--){
    61        scanf("%d%d%d",&a,&b,&c);
    62        mat[a][b]+=c;
    63      }
    64    printf("Case %d: %d
    ",i,Dinic(1,n));
    65   }
    66   return 0;
    67 }
    View Code
  • 相关阅读:
    基于maven的javaweb项目模块化开发
    ramoops具体失败原因来解释驱动寄存器
    REQIMPORT-购买内部应用程序(R12.2.3)
    iOS_动态插入或删除行
    leetcode:pascal&#39;s_triangle_II
    设计模式-----观察者模式(Obsever)
    org.eclipse.birt.report.data.oda.jdbc.JDBCException: Missing properties in Connection.open(Propertie
    Unity3D-RPG项目实战(1):发动机的特殊文件夹
    NYOJ 372 巧克力的
    LeetCode Solutions : Reorder List
  • 原文地址:https://www.cnblogs.com/gongxijun/p/3969112.html
Copyright © 2020-2023  润新知