hdu 1532 Drainage Ditches 【ISAP 】
还是不是很懂算法
先存一个模板先吧~~~
看的这篇学的--
http://www.renfei.org/blog/isap.html
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std; const int maxn = ;
const int INF = ( << ) - ; struct Edge{
int from,to,cap,flow;
}; vector<Edge> edges; int source; // 源点
int sink; // 汇点
int p[maxn]; // 可增广路上的上一条弧的编号
int num[maxn]; // 和 t 的最短距离等于 i 的节点数量
int cur[maxn]; // 当前弧下标
int d[maxn]; // 残量网络中节点 i 到汇点 t 的最短距离
bool visited[maxn]; int num_nodes; vector<int> G[maxn]; // 预处理, 反向 BFS 构造 d 数组
bool bfs()
{
memset(visited, , sizeof(visited));
queue<int> Q;
Q.push(sink);
visited[sink] = ;
d[sink] = ;
while (!Q.empty()) {
int u = Q.front();
Q.pop();
for ( int i = ;i < G[u].size();i++) {
Edge &e = edges[G[u][i]^];
if (!visited[e.from] && e.cap> e.flow) {
visited[e.from] = true;
d[e.from] = d[u] + ;
Q.push(e.from);
}
}
}
return visited[source];
} // 增广
int augment()
{
int u = sink, df = INF;
// 从汇点到源点通过 p 追踪增广路径, df 为一路上最小的残量
while (u != source) {
Edge &e = edges[p[u]];
df = min(df, e.cap - e.flow);
u = edges[p[u]].from;
}
u = sink;
// 从汇点到源点更新流量
while (u != source) {
edges[p[u]].flow += df;
edges[p[u]^].flow -= df;
u = edges[p[u]].from;
}
return df;
} int max_flow()
{
int flow = ;
bfs();
memset(num, , sizeof(num));
for (int i = ; i < num_nodes; i++) num[d[i]]++;
int u = source;
memset(cur, , sizeof(cur));
while (d[source] < num_nodes) {
if (u == sink) {
flow += augment();
u = source;
}
bool advanced = false;
for (int i = cur[u]; i < G[u].size(); i++) {
Edge& e = edges[G[u][i]];
if (e.cap > e.flow && d[u] == d[e.to] + ) {
advanced = true;
p[e.to] = G[u][i];
cur[u] = i;
u = e.to;
break;
}
}
if (!advanced) { // retreat
int m = num_nodes - ;
for ( int i = ;i < G[u].size();i++)
if (edges[G[u][i]].cap > edges[G[u][i]].flow)
m = min(m, d[edges[G[u][i]].to]);
if (--num[d[u]] == ) break; // gap 优化
num[d[u] = m+]++;
cur[u] = ;
if (u != source)
u = edges[p[u]].from;
}
}
return flow;
} void addedges(int from,int to,int cap){
edges.push_back((Edge){from,to,cap,});
edges.push_back((Edge){to,from,,});
int m = edges.size();
G[from].push_back(m-);
G[to].push_back(m-);
} void init(){
edges.clear();
for(int i = ;i < num_nodes;i++) G[i].clear();
} int main(){
int m;
while(scanf("%d %d ",&m,&num_nodes) != EOF){
init();
source = ; sink = num_nodes-;
for(int i = ;i < m;i++){
int u,v,c;
scanf("%d %d %d",&u,&v,&c);u--;v--;
addedges(u,v,c);
}
int res = max_flow();
printf("%d\n",res);
}
return ;
}
再存一个dinic的吧~~~
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <iostream>
#include <algorithm>
using namespace std;
#define lp (p << 1)
#define rp (p << 1|1)
#define getmid(l,r) (l + (r - l) / 2)
#define MP(a,b) make_pair(a,b)
typedef long long ll;
typedef unsigned long long ull;
const int INF = << ;
const int maxn = ; int c[maxn][maxn],n,m,lev[maxn];
int st,ed; void Bfs(){
memset(lev,-,sizeof(lev));
queue<int> Q;
while(!Q.empty()) Q.pop();
Q.push(st);
lev[st] = ;
while(!Q.empty()){
int x = Q.front();Q.pop();
for(int i = ; i <= ed; ++i) if(lev[i] < && c[x][i] > ){
lev[i] = lev[x] + ;
Q.push(i);
}
}
} int Dfs(int p,int minc){
if(p == ed) return minc;
for(int i = ; i <= ed; ++i) if(lev[i] > lev[p] && c[p][i] > ){
int d = Dfs(i,min(c[p][i],minc));
if(d > ){
c[p][i] -= d;
c[i][p] += d;
return d;
}
}
return ;
} int Dinic(){
int max_flow = ,plus;
while(){
Bfs();
if(lev[ed] < ) break;
while((plus = Dfs(,INF)) > ) max_flow += plus;
}
return max_flow;
} int main(){
while(scanf("%d %d",&m,&n) != EOF){
st = ;ed = n;
memset(c,,sizeof(c));
for(int i = ;i <= m;i++){
int u,v,w;
scanf("%d %d %d",&u,&v,&w);
c[u][v] += w;
}
printf("%d\n",Dinic());
}
return ;
}
hdu 1532 Drainage Ditches 【ISAP 】的更多相关文章
- hdoj 1532 Drainage Ditches【最大流模板题】
Drainage Ditches Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- poj 1273 && hdu 1532 Drainage Ditches (网络最大流)
Drainage Ditches Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 53640 Accepted: 2044 ...
- HDU 1532 Drainage Ditches (网络流)
A - Drainage Ditches Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64 ...
- POJ_1273 Drainage Ditches 【网络流】
一.题面 Drainage Ditches 二.分析 网络流的裸题. 1 Edmonds-Karp算法 求解网络流其实就是一个不断找增广路,然后每次找到一条增广路后更新残余网络的一个过程. EK算法主 ...
- HDU 1532 Drainage Ditches 分类: Brush Mode 2014-07-31 10:38 82人阅读 评论(0) 收藏
Drainage Ditches Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- POJ 1273 || HDU 1532 Drainage Ditches (最大流模型)
Drainage DitchesHal Burch Time Limit 1000 ms Memory Limit 65536 kb description Every time it rains o ...
- HDU1532 Drainage Ditches 【最大流量】
Drainage Ditches Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- HDU 1532 Drainage Ditches (最大网络流)
Drainage Ditches Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) To ...
- hdu 1532 Drainage Ditches(最大流)
Drainage Dit ...
随机推荐
- USACO 2008 Mar Silver 3.River Crossing 动态规划水题
Code: #include<cstring> #include<algorithm> #include<cstdio> using namespace std; ...
- 路飞学城Python-Day108
96-分页器1 批量插入的方式就不能用ORM的create()方式去做了,因为create就是对sql进行insert的操作,sql最好不要每次有一条数据就去进行插入,最好的方式就是插入一组数据 fr ...
- node——buffer
buffe方便数据的传输,可一次性传输一部分数据一.类型介绍1.javascript语言没有读取或操作二进制数据的机制.2.Node.js中引入了Buffer类型可以使我们操作TCP流或文件流3.Bu ...
- UNIX时间转换ASP代码.txt
'参数:strTime:要转换的时 间:intTimeZone:该时间对应的时区 '返回值:strTime相对于1970年1月1日午夜0点经过的秒数 '示例:ToUnixTime("2008 ...
- ELO kernels 记录
these kernel for discuss how to handle outliers in target values. 一:Ashish Gupta: 在16年6月到18年8月,激活卡的人 ...
- 训练1-Y
对于给定的一个字符串,统计其中数字字符出现的次数. Input 输入数据有多行,第一行是一个整数n,表示测试实例的个数,后面跟着n行,每行包括一个由字母和数字组成的字符串 Output 对于每个测试实 ...
- fun(int **p)的使用
#include <iostream>using namespace std;void fun(int **p){ cout << p[0][0] << endl; ...
- 安装oracle服务端之后再安装oracle客户端导致sqlplus命令无法使用??
首先小编自述一下所遇到的问题: 昨天在已经安装 oracle 服务端的 win7 X64 主机上安装 oracle client 之后,发现我的sqlplus命令无法用了??经过百度,都说我服务没有开 ...
- 数据库优化一般思路(PLSQL、Navicat)
SQL执行过程: 1.执行SQL时,sql解析引擎会被启动 2.数据类型和数据库表定义的数据类型不一致,数据库引擎会自动转化 3.数据库表定义了多个索引,sql引擎会帮你选择最优的一个 4.数据库引擎 ...
- java8新特性:利用Lambda处理List集合
Java 8新增的Lambda表达式,我们可以用简洁高效的代码来处理List. 1.遍历 public static void main(String[] args) { List<User&g ...