hdoj 3549 Flow Problem【网络流最大流入门】

Flow Problem

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

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

刚开始看不是太理解  解析会后续更新

#include<stdio.h>
#include<string.h>
#include<stack>
#include<queue>
#include<vector>
#include<algorithm>
#define INF 0x7fffff
#define MAX 2100
using namespace std;
int ans,head[MAX];
int n,m;
int dis[MAX],vis[MAX];
int cur[MAX];
struct node
{
	int beg,end,cap,flow,next;
}edge[MAX];
void init()
{
	ans=0;
	memset(head,-1,sizeof(head));
}
void add(int u,int v,int w)
{
	edge[ans].beg=u;
	edge[ans].end=v;
	edge[ans].cap=w;
	edge[ans].flow=0;
	edge[ans].next=head[u];
	head[u]=ans++;
}
void getmap()
{
	int i,a,b,c;
	while(m--)
	{
		scanf("%d%d%d",&a,&b,&c);
		add(a,b,c);
		add(b,a,0);
	}
}
int bfs(int start,int over)
{
	int i,v;
	memset(dis,-1,sizeof(dis));
	memset(vis,0,sizeof(vis));
    queue<int>q;
    while(!q.empty())
        q.pop();
    q.push(start);
    vis[start]=1;
    dis[start]=0;
    while(!q.empty())
    {
    	int u=q.front();
    	q.pop();
    	for(i=head[u];i!=-1;i=edge[i].next)
    	{
    	    v=edge[i].end;
			if(!vis[v]&&edge[i].cap>edge[i].flow)
			{
				vis[v]=1;
				dis[v]=dis[u]+1;
				if(v==over)
				    return 1;
				q.push(v);
			}
    	}
    }
    return 0;
}
int dfs(int x,int a,int over)
{
	if(x==over||a==0)
	    return a;
	int flow=0,f;
	for(int& i=cur[x];i!=-1;i=edge[i].next)
	{
		if(dis[x]+1==dis[edge[i].end]&&(f=dfs(edge[i].end,min(a,edge[i].cap-edge[i].flow),over))>0)
		{
			edge[i].flow+=f;
			edge[i^1].flow-=f;
			flow+=f;
			a-=f;
			if(a==0) break;
		}
	}
	return flow;
}
int maxflow(int start,int over)
{
	int flow=0;
	while(bfs(start,over))
	{
		memcpy(cur,head,sizeof(head));
		flow+=dfs(start,INF,over);
	}
	return flow;
}
int main()
{
	int t,k,j,i;
	scanf("%d",&t);
	k=1;
	while(t--)
	{
		scanf("%d%d",&n,&m);
		init();
		getmap();
		printf("Case %d: ",k++);
		printf("%d\n",maxflow(1,n));
	}
	return 0;
}

  

时间: 2024-12-26 00:31:47

hdoj 3549 Flow Problem【网络流最大流入门】的相关文章

hdoj 3549 Flow Problem 【最大流】

题目:hdoj 3549 Flow Problem 题意:给出一个图,让你求最大流. 分析:这个题目用dinci写的,因为点比较少,而dinci复杂度O(m*n^2),但是还是跑了160ms,不知道15的神牛怎么写的. dinci的写法要注意的地方就是存图的时候要考虑怎么存,因为要更新网络残量,即反向的流量,所以这里要注意一下. 思想就不讲了,很多地方有讲. 代码: #include <cstdio> #include <cstring> #include <iostream

题解报告:hdu 3549 Flow Problem(最大流入门)

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

hdu 3549 Flow Problem(最大流模板题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3549 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

hdu 3549 Flow Problem (网络最大流)

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

HDU 3549 Flow Problem(最大流模板)

http://acm.hdu.edu.cn/showproblem.php?pid=3549 刚接触网络流,感觉有点难啊,只好先拿几道基础的模板题来练练手. 最大流的模板题. 1 #include<iostream> 2 #include<cstring> 3 #include<string> 4 #include<algorithm> 5 #include<queue> 6 using namespace std; 7 8 int n, m,

HDU 3549 Flow Problem(最大流)

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

HDU 3549 Flow Problem (最大流ISAP)

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

[ACM] hdu 3549 Flow Problem (最大流模板题)

Flow Problem 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 nu

hdoj 3549 Flow Problem(最大网络流)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3549 思路分析:该问题为裸的最大网络流问题,数据量不大,使用EdmondsKarp算法求解即可:需要注意的是该问题的点最多有15个,边的数目最多有1000个,所以该图中存在重边,需要将多个重边合为一条边: 代码如下: #include <queue> #include <vector> #include <cstdio> #include <climits> #