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. 关于 ActiveMQ 的消息模式

    1.JMS Queue 执行 load balancer语义:一条消息仅能被一个 consumer(消费者) 收到.如果在 message 发送的时候没有可用的consumer,那么它将被保存一直到能 ...

  2. Linux 进程状态【转】

    转自:http://www.cnblogs.com/itech/p/3208261.html 来自: http://blog.csdn.net/tianlesoftware/article/detai ...

  3. 今天 同一个Nav 左右button 替换不显示的问题 viewDidLoad, viewWillDisappear, viewWillAppear等区别及各自的加载顺序

    viewWillAppear:  Called when the view is about to made visible. Default does nothing视图即将可见时调用.默认情况下不 ...

  4. OpenStack集成Docker

    声明:绝对原创,欢迎转载,但请标明出处,谢谢! 最近在做openstack与Docker的集成工作,走了不少弯路,遇到不少问题,不过最终搭建成功了.现在将过程分享出来,以供参考. 一.环境介绍 1.软 ...

  5. Codeforces Gym 101142C:CodeCoder vs TopForces(搜索)

    http://codeforces.com/gym/101142/attachments 题意:每个人在TC和CF上分别有两个排名,如果有一个人在任意一个网站上大于另一个人的排名,那么这个人可以打败另 ...

  6. C#:实现托盘

    1.向窗体上添加如下控件:MenuStrip menuStrip1, NotifyIcon ni_frmMain,Timer timer1, ContentMenuStrip cms_notify.其 ...

  7. Javascript页面之间参数传递 (前端)

    一.来源:tongfang [系统管理员] --[系统管理] 的"SysLeftNavView.ascx.cs 用户插件 usercontrol 左侧菜单导航: <li>< ...

  8. [BIM]BIM中IDM介绍

    参考:http://blog.fang.com/25866228/10613454/articledetail.htm IDM的全称是Information Delivery Manual,信息交付手 ...

  9. 关于left join、right join和inner join

    总结, 1.select * from A left join B on A.XX=B.XX 左侧显示A的列名,右侧显示B的列名 左侧,显示A表的所有列 右侧, A.XX=B.XX的时候,显示B表的列 ...

  10. 我的CSS样式记事本(1)

    文本 行高: line-height 对齐方式: text-align 字符间距: letter-spacing 文本修饰: text-decoration字体 设置字体所有: font 字体类型: ...