HDU 3549 Flow Problem(最大流)

Time Limit: 5000/5000 MS (Java/Others)

Memory Limit: 65536/32768 K (Java/Others)

【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.

网络流是ACMers众所周知的一个难题。给定一幅图,你的任务是找出这个加权有向图的最大流。

【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)

输入的第一行是一个整数T,表示测试用例的数量。

对于每个测试用例,第一行有两个整数N和M,表示图中顶点与边的数量。(2 <= N <= 15, 0 <= M <= 1000)接着M行,每行三个整数X,Y和C,有一条从X到Y的边,其容量为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.

对于每个测试样例,输出从源点1到汇点N的最大流。

【Sample Input - 输入样例】

【Sample Output - 输出样例】

2

3 2

1 2 1

2 3 1

3 3

1 2 1

2 3 1

1 3 1

Case 1: 1

Case 2: 2

【题解】

最大流问题

题目描述得太简单,自己从来没做过,就去百度了一下大概的规则

然后……就当成水管来看吧…………

比较简单的方式的用DFS实现,注意处理好搜索与回溯即可。

搜索时可以每次只找一条1→N的路径,也可以在当前已走过的路径下尽可能地推送流量到N,即多条路径(不过这种方式比较费时,因为会在重复尝试一些无效的路径)

为了方便回溯,每次A→B推送的流量等于添加B→A的容量。

vector的查询速度并不是很快,多次使用的时候用指针或是继承可以提高速度,以及看/写起来舒服点……

【代码 C++】

 #include<cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
int n;
struct edge{
int next, capacity, last_i;
};
std::vector<edge> data[];
bool us[];
void read(){
int m, x, y, c, i, j, map[][];
memset(map, , sizeof(map));
scanf("%d%d", &n, &m);
for (i = ; i <= n; ++i) data[i].clear();
for (i = ; i < m; ++i) scanf("%d%d%d", &x, &y, &c), map[x][y] += c;
edge temp = { , , };
for (i = ; i < n; ++i){
for (j = i + ; j <= n; ++j){
if (map[i][j] + map[j][i] == ) continue;
temp.next = j; temp.capacity = map[i][j]; temp.last_i = data[j].size();
data[i].push_back(temp);
temp.next = i; temp.capacity = map[j][i]; temp.last_i = data[i].size() - ;
data[j].push_back(temp);
}
}
}
int send(int nowEdge, int flowWait){
if (nowEdge == n) return flowWait;
us[nowEdge] = ;
int hadSend, temp, i, ed = data[nowEdge].size();
for (i = hadSend = ; i < ed; ++i){
edge &now = data[nowEdge][i];
if (!us[now.next] && now.capacity){
temp = send(now.next, std::min(now.capacity, flowWait - hadSend));
if (temp){
hadSend += temp; now.capacity -= temp;
data[now.next][now.last_i].capacity += temp;
}
}
}
return hadSend;
}
int main(){
int t, i, opt, temp;
for (i = scanf("%d", &t); i <= t; ++i){
printf("Case %d: ", i);
read();
for (opt = ; memset(us, , sizeof(us));){
temp = send(, );
if (temp) opt += temp;
else break;
}
printf("%d\n", opt);
}
return ;
}

HDU 3549 Flow Problem(最大流)的更多相关文章

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

    http://acm.hdu.edu.cn/showproblem.php?pid=3549 Ford-Fulkerson算法. #include <iostream> #include ...

  2. hdu 3549 Flow Problem (最大流)

    裸最大流,做模板用 m条边,n个点,求最大流 #include <iostream> #include <cstdio> #include <cstring> #i ...

  3. hdu 3549 Flow Problem 最大流 Dinic

    题目链接 题意 裸的最大流. 学习参考 http://www.cnblogs.com/SYCstudio/p/7260613.html Code #include <bits/stdc++.h& ...

  4. 网络流 HDU 3549 Flow Problem

    网络流 HDU 3549 Flow Problem 题目:pid=3549">http://acm.hdu.edu.cn/showproblem.php?pid=3549 用增广路算法 ...

  5. hdu 3549 Flow Problem【最大流增广路入门模板题】

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3549 Flow Problem Time Limit: 5000/5000 MS (Java/Others ...

  6. hdu 3549 Flow Problem

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=3549 Flow Problem Description Network flow is a well- ...

  7. HDU 3549 Flow Problem (最大流ISAP)

    Flow Problem Time Limit: 5000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Tota ...

  8. hdu 3549 Flow Problem Edmonds_Karp算法求解最大流

    Flow Problem 题意:N个顶点M条边,(2 <= N <= 15, 0 <= M <= 1000)问从1到N的最大流量为多少? 分析:直接使用Edmonds_Karp ...

  9. HDU 3549 Flow Problem 网络流(最大流) FF EK

    Flow Problem Time Limit: 5000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Tot ...

随机推荐

  1. Ubuntu 13.10 64位 无法 安装 ia32-libs 解决办法

    安装新立德软件包管理器:打开终端,输入以下命令:sudo apt-get install synaptic 打开新立德软件包管理器,选择“设置>软件库” 选择“其他软件 > 添加” 在AP ...

  2. css分离思想

    CSS命名就应该最简单.最直接,直捣黄龙.没有HTML标签,没有层级,这些通通滚蛋,不要.为什么不要,有三大原因: 1. 限制重用 我们会使用层级(#test .test),会使用标签(ul.test ...

  3. innodb内部的并发线程

    1. innodb_thread_concurrency innodb有一系列的计数器来统计和控制内部的工作线程.其中最重要的一个是innodb_thread_concurrency,和它相关的inn ...

  4. Sublime Text 3 常用插件以及安装方法

    安装Sublime Text 3插件的方法: 一.直接安装 安装Sublime text 2插件很方便,可以直接下载安装包解压缩到Packages目录(菜单->preferences->p ...

  5. Java、JVM和操作系统之间的关系,写给新人,

    来张图:这个帖子写给新人的,老玩家就直接无视他,因为这个完完全全是白话基础原理. 解释:上面的图是从上往下依次调用的关系. 操作系统(Windows/Linux)管理硬件,让硬件能够正常.合理的运行, ...

  6. php中urlencode与rawurlencode的区别有那些呢

    urlencode 函数: 返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+).此编码与 WWW 表单 POST 数据的编码 ...

  7. 【转】去掉eclipse的validate

    转载地址:http://www.blogjava.net/leisure/archive/2013/01/11/394087.html 困扰了好几天,与大家共享 1,在project名称上右键选择pr ...

  8. js笔记---封装自己的Ajax方法

    //地址 成功方法 失败方法function Ajax(url, funsucc, funfial) { var oAjax = null; if (window.XMLHttpRequest) { ...

  9. 【转】写一个标准宏MIN,这个宏输入两个参数并返回较小的那个。另外当写下least=MIN(*p++,b)时会发生什么

    解答:#define MIN(A,B) ((A) <= (B) ? (A) : (B)) MIN(*p++, b)会产生宏副作用 剖析:这个面试题主要考察宏定义可以实现函数的功能.但是它终归不是 ...

  10. CentOS 安装ftp

    Linux安装ftp组件 1 安装vsftpd组件 安装完后,有/etc/vsftpd/vsftpd.conf 文件,是vsftp的配置文件. [root@bogon ~]# yum -y insta ...