zoukankan      html  css  js  c++  java
  • HDU 3549 基础网络流EK算法 Flow Problem

    Flow Problem

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


    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
     
    Recommend
    zhengfeng   |   We have carefully selected several similar problems for you:  1532 3572 3416 3081 3491 
     
    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    using namespace std;
    int dp[100][100],pre[100];
    const int tmin=999999999;
    int maxflow;
    void EK(int start,int end,int n){
        while(1){
            queue<int>q;
            q.push(1);
           int  minflow=tmin;
            memset(pre,0,sizeof(pre));
            while(!q.empty()){
                int u=q.front();
                q.pop();
                for(int i=1;i<=n;i++){
                    if(dp[u][i]>0&&!pre[i]){
                        pre[i]=u;
                        q.push(i);
                    }
                }
            }
            if(pre[end]==0)
                break;
            for(int i=end;i!=start;i=pre[i]){
                minflow=min(dp[pre[i]][i],minflow);
            }
            for(int i=end;i!=start;i=pre[i]){
                dp[pre[i]][i]-=minflow;
                dp[i][pre[i]]+=minflow;
            }
            maxflow+=minflow;
        }
    }
    int main(){
       int count=0;
       int n,m;
       int t;
       scanf("%d",&t);
       while(t--){
            scanf("%d%d",&n,&m);
           memset(dp,0,sizeof(dp));
           memset(pre,0,sizeof(pre));
           count++;
           int u,v,w;
           for(int i=1;i<=m;i++){
               scanf("%d%d%d",&u,&v,&w);
               dp[u][v]+=w;
           }
           maxflow=0;
           EK(1,n,n);
           printf("Case %d: %d
    ",count,maxflow);
       }
       return 0;
    }
  • 相关阅读:
    程序员常用英语词汇
    声明式编程与命令式编程
    vue 常用ui组件库
    Vue 组件之间传值
    vscode插件之背景插件(background)
    iconfont的使用
    CSS3 @font-face 规则
    CSS抗锯齿 font-smoothing 属性介绍
    new Image 读取宽高为0——onload
    js的for循环中出现异步函数,回调引用的循环值始终是最后的值
  • 原文地址:https://www.cnblogs.com/13224ACMer/p/4679477.html
Copyright © 2011-2022 走看看