博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 3549 Flow Problem(最大流模板题)
阅读量:4307 次
发布时间:2019-06-06

本文共 2955 字,大约阅读时间需要 9 分钟。

题目链接:

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 
#include
#include
#include
using namespace std;const int MAXN = 32;//点数的最大值const int MAXM = 1017;//边数的最大值const int INF = 0x3f3f3f3f;struct Edge{ int to, cap, flow; int next;}edge[MAXM];//注意是MAXMint tol;int head[MAXN];int dep[MAXN],pre[MAXN],cur[MAXN];int gap[MAXN];//gap[x]=y :说明残留网络中dep[i]==x的个数为yvoid init(){ tol = 0; memset(head,-1,sizeof (head));}//加边,单向图三个參数。双向图四个參数void addedge (int u,int v,int w,int rw=0){ edge[tol].to = v;edge[tol].cap = w; edge[tol].next = head[u]; edge[tol].flow = 0; head[u] = tol++; edge[tol].to = u;edge[tol].cap = rw; edge[tol]. next = head[v]; edge[tol].flow = 0;head[v]=tol++;}//输入參数:起点、终点、点的总数//点的编号没有影响,仅仅要输入点的总数int sap(int start,int end, int N){ memset(gap,0,sizeof(gap)); memset(dep,0,sizeof(dep)); memcpy(cur,head,sizeof(head)); int u = start; pre[u] = -1; gap[0] = N; int ans = 0; int i; while(dep[start] < N) { if(u == end) { int Min = INF; for( i = pre[u];i != -1; i = pre[edge[i^1]. to]) { if(Min > edge[i].cap - edge[i]. flow) Min = edge[i].cap - edge[i].flow; } for( i = pre[u];i != -1; i = pre[edge[i^1]. to]) { edge[i].flow += Min; edge[i^1].flow -= Min; } u = start; ans += Min; continue; } bool flag = false; int v; for( i = cur[u]; i != -1;i = edge[i].next) { v = edge[i]. to; if(edge[i].cap - edge[i].flow && dep[v]+1 == dep[u]) { flag = true; cur[u] = pre[v] = i; break; } } if(flag) { u = v; continue; } int Min = N; for( i = head[u]; i != -1; i = edge[i]. next) { if(edge[i].cap - edge[i].flow && dep[edge[i].to] < Min) { Min = dep[edge[i].to]; cur[u] = i; } } gap[dep[u]]--; if(!gap[dep[u]]) return ans; dep[u] = Min+1; gap[dep[u]]++; if(u != start) u = edge[pre[u]^1].to; } return ans;}int main(){ int n, m; int a, b, w; int c, s, t; int i; int T; int cas = 0; scanf("%d",&T); while(T--) { init();//初始化 scanf("%d%d",&n,&m); for(i = 1; i <= m; i++)//边数 { scanf("%d%d%d",&a,&b,&w); addedge(a,b,w,0); // addedge(b,a,w,0); } int ans = sap(1, n, n); printf("Case %d: %d\n",++cas,ans); } return 0;}

转载于:https://www.cnblogs.com/brucemengbm/p/6846246.html

你可能感兴趣的文章
js 类数组arguments详解
查看>>
前段技术学习计划
查看>>
隐藏GridControl的“Drag a column header here to group by that column”
查看>>
安卓UI测试(基于android studio环境 espresso框架)
查看>>
iOS 获取当前对象所在的VC
查看>>
[译]如何在visual studio中调试Javascript
查看>>
expect
查看>>
Swift3.0语言教程获取C字符串
查看>>
XamarinAndroid组件教程RecylerView适配器设置动画示例
查看>>
Shell 示例:利用 $RANDOM 产生随机整数
查看>>
网络基础
查看>>
海量数据处理之倒排索引
查看>>
Repeater\DataList\GridView实现分页,数据编辑与删除
查看>>
software testing hw2- find the error
查看>>
maven系列一:pom.xml文件详解
查看>>
Python基础实践-密码管理系统实例
查看>>
iOS工作笔记之NSClassFromString
查看>>
PING检查网络是否畅通
查看>>
李宁-2015年7月13日-个人文档
查看>>
C# 通过URL获取图片并显示在PictureBox上的方法
查看>>