hdu 3549 最大流入门题

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3549


【科普】什么是BestCoder?如何参加?

Flow Problem

Time Limit: 5000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)

Total Submission(s): 8862    Accepted Submission(s): 4168

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

初学网络流,首先得对 流网络的一些概念有些认识(增广路径,残留网,割),沿着增广路径可以向其中压入一些流来达到增大流;

可以从 http://www.cnblogs.com/luweiseu/archive/2012/07/14/2591573.html  学习网络流基础

 /*
网络流入门题,EK算法找最大流
*/
#include <iostream>
#include <stdio.h>
#include <string>
#include <string.h>
#include <algorithm>
#include <queue>
const int N=100;
using namespace std;

int pre[N]; // pre[i]表示顶点i的前驱顶点
int vis[N];
int map[N][N]; //残留网络中每条边的容量
int s,t;
int n,m;

bool bfs()
{
  memset(vis,0,sizeof(vis));
  memset(pre,0,sizeof(pre));
  queue<int>que;
  vis[s]=1,que.push(s);
  while(!que.empty())
  {
    int cur=que.front();
            que.pop();
     if(cur==t)return true;
    for(int i=1;i<=n;i++)
    {
     if( !vis[i] && map[cur][i])
     {
         vis[i]=1;
         que.push(i);
         pre[i]=cur;
     }
    }
  }
  return false;
}

int Max_Flow()
{
  int ans=0;
  while( true )
  {
    if(!bfs())return ans;
    int Min=99999999;
    for(int i=t;i!=s;i=pre[i])
        Min=min(Min,map[pre[i]][i]);  //找到这条增广路径中容量最小的一个值
    for(int i=t;i!=s;i=pre[i])
    {
        map[pre[i]][i]-=Min;
        map[i][pre[i]]+=Min;
    }
    ans+=Min;
  }
  return ans;
}

int main()
{
  int T,test=1;
  scanf("%d",&T);
  while(T--)
  {
   scanf("%d%d",&n,&m);
   s=1,t=n;
   memset(map,0,sizeof(map));
   while(m--)
   {
     int u,v,c;
     scanf("%d%d%d",&u,&v,&c);
     map[u][v]+=c;
   }
   printf("Case %d: %d\n",test++,Max_Flow());
  }
  return 0;
}
时间: 2024-10-12 13:58:22

hdu 3549 最大流入门题的相关文章

HDU 3549 最大流入门

Flow Problem Time Limit: 5000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 8394    Accepted Submission(s): 3910 Problem Description Network flow is a well-known difficult problem for ACMers. Given a graph, yo

hdu 1086(计算几何入门题——计算线段交点个数)

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1086 You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7167    Accepted Submission(s): 3480 Problem Description Ma

hdu 1533 Going Home 最小费用最大流 入门题

Going Home Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3125    Accepted Submission(s): 1590 Problem Description On a grid map there are n little men and n houses. In each unit time, every

HDU 3549(网络流入门之最大流)

Flow Problem Time Limit: 5000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 10327    Accepted Submission(s): 4866 Problem Description Network flow is a well-known difficult problem for ACMers. Given a graph,

hdu 5919 主席树入门题

主席树是从右往左初始化,每次把这个数出现过的位置消去,然后在当前位置加一. 然后我的做法是查两遍,第一遍能找出不同的个数,除一半:再用这个值查,一直到底,最后返回位置,比较套路的一题. #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include &l

hdu 3549(最大流)

依旧是最大流板子 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> #include <vector> using namespace std; struct note { int fr,to,c,f; note(int a,int b,int x,int y):fr(a),to(b),c(x),

HDU 1532 最大流模板题

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1532 最近在学网络流,学的还不好,先不写理解了,先放模板... 我觉得写得不错的博客:http://blog.csdn.net/smartxxyx/article/details/9293665/ 1 #include<stdio.h> 2 #include<string.h> 3 #include<vector> 4 #define maxn 222 5 #define in

hdu 4292 最大流 水题

很裸的一道最大流 格式懒得排了,注意把人拆成两份,一份连接食物,一份连接饮料 4 3 3 //4个人,3种食物,3种饮料 1 1 1 //食物每种分别为1 1 1 1 //饮料每种数目分别为1 YYN //第一个人对第1,2,3种食物的态度为接受,接受和拒绝 NYY YNY YNY YNY //第一个人对第1,2,3种饮料的态度为接受,拒绝和接受 YYN YYN NNY 3 1 #include<cstdio> 2 #include<iostream> 3 #include<

poj 1273 Drainage Ditches 最大流入门题

题目链接:http://poj.org/problem?id=1273 Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover patch. This means that the clover is covered by water for awhile and takes quite a long time to regrow. Thus, Farmer John has