HDU1532_Drainage Ditches(网络流/EK模板/Dinic模板(邻接矩阵/前向星))
Drainage Ditches
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 8599 Accepted Submission(s): 4005
clover patch is never covered in water. Instead, the water is drained to a nearby stream. Being an ace engineer, Farmer John has also installed regulators at the beginning of each ditch, so he can control at what rate water flows into that ditch.
Farmer John knows not only how many gallons of water each ditch can transport per minute but also the exact layout of the ditches, which feed out of the pond and into each other and stream in a potentially complex network.
Given all this information, determine the maximum rate at which water can be transported out of the pond and into the stream. For any given ditch, water flows in only one direction, but there might be a way that water can flow in a circle.
1 is the pond. Intersection point M is the stream. Each of the following N lines contains three integers, Si, Ei, and Ci. Si and Ei (1 <= Si, Ei <= M) designate the intersections between which this ditch flows. Water will flow through this ditch from Si to
Ei. Ci (0 <= Ci <= 10,000,000) is the maximum rate at which water will flow through the ditch.
5 4
1 2 40
1 4 20
2 4 20
2 3 30
3 4 10
50
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#define inf 99999999
#define N 220
#define M 220
using namespace std;
int n,m,edge[N][N],flow,a[N],p[N];
queue<int>Q;
void ek()
{
while(1)
{
while(!Q.empty())
Q.pop();
memset(a,0,sizeof(a));
memset(p,0,sizeof(p));
Q.push(1);
a[1]=inf;
p[1]=1;
while(!Q.empty())
{
int u=Q.front();
Q.pop();
for(int v=1;v<=n;v++)
{
if(!a[v]&&edge[u][v]>0)
{
a[v]=min(a[u],edge[u][v]);
p[v]=u;
Q.push(v);
}
}
if(a[n])break;
}
if(!a[n])break;
for(int u=n;u!=1;u=p[u])
{
edge[p[u]][u]-=a[n];
edge[u][p[u]]+=a[n];
}
flow+=a[n];
}
}
int main()
{
int i,j,u,v,w;
while(~scanf("%d%d",&m,&n))
{
flow=0;
memset(edge,0,sizeof(edge));
for(i=0;i<m;i++)
{
scanf("%d%d%d",&u,&v,&w);
edge[u][v]+=w;
}
ek();
printf("%d\n",flow);
}
}
又学了Dinic算法。
。。
(基于邻接矩阵的)。前向星不知道怎么处理反向弧。。。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#define inf 99999999
#define N 200
#define M 200
using namespace std;
int edge[N][N],flow,l[N],n,m;
int bfs()
{
memset(l,-1,sizeof(l));
queue<int>Q;
l[1]=0;
Q.push(1);
while(!Q.empty())
{
int u=Q.front();
Q.pop();
for(int v=1;v<=n;v++)
{
if(edge[u][v]&&l[v]==-1)
{
l[v]=l[u]+1;
Q.push(v);
}
}
}
if(l[n]>0)
return 1;
else return 0;
}
int dfs(int x,int f)
{
if(x==n)return f;
int a;
for(int i=1;i<=n;i++)
{
if(edge[x][i]&&(l[i]==l[x]+1)&&(a=dfs(i,min(f,edge[x][i]))))
{
edge[x][i]-=a;
edge[i][x]+=a;
return a;
}
}
return 0;
}
int main()
{
int i,j,u,v,w;
while(~scanf("%d%d",&m,&n))
{
memset(edge,0,sizeof(edge));
for(i=0;i<m;i++)
{
scanf("%d%d%d",&u,&v,&w);
edge[u][v]+=w;
}
int a=0;
flow=0;
while(bfs())
while(a=dfs(1,inf))
flow+=a;
printf("%d\n",flow);
}
return 0;
}
最终觉醒了,之前看了一串非递归的前向星dinic,,。老认为不正确。,,换了一种思路,写成递归调用dfs和邻接表一样,对于处理反向弧加流的话在建边的时候处理,建边一次建两条,正向和反向,这样就知道。反向弧在哪里了,,。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#define N 300
#define M 30000
#define inf 99999999
using namespace std;
struct node
{
int u,v,w,r,next;
}edge[M]; int n,m,head[N],l[N],cnt;
void add(int u,int v,int w)
{
edge[cnt].u=u;
edge[cnt].v=v;
edge[cnt].w=w;
edge[cnt].next=head[u];
edge[cnt].r=cnt+1;
head[u]=cnt++;
edge[cnt].u=v;
edge[cnt].v=u;
edge[cnt].w=0;
edge[cnt].next=head[v];
edge[cnt].r=cnt-1;
head[v]=cnt++;
}
int bfs()
{
queue<int >Q;
while(!Q.empty())
Q.pop();
Q.push(1);
memset(l,-1,sizeof(l));
l[1]=0;
while(!Q.empty())
{
int u=Q.front();
Q.pop();
for(int i=head[u];i!=-1;i=edge[i].next)
{
if(edge[i].w&&l[edge[i].v]==-1)
{
l[edge[i].v]=l[u]+1;
Q.push(edge[i].v);
}
}
}
if(l[n]>0)return 1;
else return 0;
}
int dfs(int x,int f)
{
int i,a;
if(x==n)return f;
for(i=head[x];i!=-1;i=edge[i].next)
{
if(edge[i].w&&l[edge[i].v]==l[x]+1&&(a=dfs(edge[i].v,min(f,edge[i].w))))
{
edge[i].w-=a;
edge[edge[i].r].w+=a;
return a;
}
}
return 0;
}
int main()
{
int i,j,u,v,w;
while(cin>>m>>n)
{
memset(head,-1,sizeof(head));
memset(edge,0,sizeof(edge));
cnt=0;
for(i=0;i<m;i++)
{
cin>>u>>v>>w;
add(u,v,w);
}
int ans=0,a;
while(bfs())
while(a=dfs(1,inf))
ans+=a;
cout<<ans<<endl;
}
}
HDU1532_Drainage Ditches(网络流/EK模板/Dinic模板(邻接矩阵/前向星))的更多相关文章
- poj-1459-最大流dinic+链式前向星-isap+bfs+stack
title: poj-1459-最大流dinic+链式前向星-isap+bfs+stack date: 2018-11-22 20:57:54 tags: acm 刷题 categories: ACM ...
- 【模板】链式前向星+spfa
洛谷传送门--分糖果 博客--链式前向星 团队中一道题,数据很大,只能用链式前向星存储,spfa求单源最短路. 可做模板. #include <cstdio> #include <q ...
- 模板 Dijkstra+链式前向星+堆优化(非原创)
我们首先来看一下什么是前向星. 前向星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序, 并记录下以某个点为起点的所有边在数组中的起始位置和 ...
- zzuli 2131 Can Win dinic+链式前向星(难点:抽象出网络模型+建边)
2131: Can Win Time Limit: 1 Sec Memory Limit: 128 MB Submit: 431 Solved: 50 SubmitStatusWeb Board ...
- 存图方式---邻接表&邻接矩阵&前向星
基于vector存图 struct Edge { int u, v, w; Edge(){} Edge(int u, int v, int w):u(u), v(v), w(w){} }; vecto ...
- 网络流--最大流dinic模板
标准的大白书式模板,除了变量名并不一样……在主函数中只需要用到 init 函数.add 函数以及 mf 函数 #include<stdio.h> //差不多要加这么些头文件 #includ ...
- 网络流--最大流--Dinic模板矩阵版(当前弧优化+非当前弧优化)
//非当前弧优化版 #include <iostream> #include <cstdio> #include <math.h> #include <cst ...
- 网络流-最大流 Dinic模板
#include <bits/stdc++.h> using namespace std; #define MP make_pair #define PB push_back #defin ...
- Drainage Ditches(网络流(EK算法))
计算最大流,EK算法模板题. #include <stdio.h> #include <string.h> #include <queue> using names ...
随机推荐
- 一个关于python装饰器参数的问题
看到廖雪峰python教程上,python装饰器一章 https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3 ...
- POJ——1195Mobile phones(二维树状数组点修改矩阵查询)
Mobile phones Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 17764 Accepted: 8213 De ...
- [OJ#15]TR #2 画心
[OJ#15]TR #2 画心 试题描述 渠是一名画师.渠有一支神奇的画笔,可以画尽因果. 渠要画一幅画,这幅画由N个线段组成,线段从1开始编号,第i条线段有一个特殊的因果值Ai. 由于画太长了,渠不 ...
- Eclipse + Apache Axis2 发布RESTful WebService(三)第一个程序Hello Axis2 !(未成功)
此路不通 Axis2发布SOAP WebService非常简单,建一个Dynamic Web Project,然后为它建一个Axis的Web Service(Tomcat7+JDK),就会生成Clas ...
- wamp出现You don’t have permission to access/on this server提示
本地搭建wamp,输入http://127.0.0.1访问正常,当输入http://localhost/,apache出现You don't have permission to access/on ...
- 开源 project
移动:http://www.csdn.net/article/2014-04-22/2819435-facebook-mobile-open-source-projects/1
- 百万级日活 App 的屏幕录制功能是如何实现的
Android 从 4.0 开始就提供了手机录屏方法,但是需要 root 权限,比较麻烦不容易实现.但是从 5.0 开始,系统提供给了 App 录制屏幕的一系列方法,不需要 root 权限,只需要用户 ...
- HDU1724 Ellipse
Math is important!! Many students failed in 2+2’s mathematical test, so let's AC this problem to mou ...
- Android上下文Context
Android上下文Context介绍 在应用开发中最熟悉而陌生的朋友-----Context类 ,说它熟悉,是应为我们在开发中时刻的在与它打交道,例如:Service.BroadcastReceiv ...
- 在 POSIX 线程编程中避免内存泄漏
检测和避免 POSIX 线程内存泄漏的技巧 POSIX 线程(pthread)编程定义了一套标准的 C 编程语言类型.函数和常量 — 且 pthreads 提供了一种强大的线程管理工具.要充分使用 p ...