hdu3549网络流之最大流
Ford-Fulkerson方法:dfs实现
dfs 140ms
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<cassert>
#include<iomanip>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pi acos(-1)
#define ll long long
#define mod 10007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; const double g=10.0,eps=1e-;
const int N=+,maxn=+,inf=; int t,n,m;
int vis[maxn];//判断是否访问过
int c[maxn][maxn];//邻接矩阵存图
int dfs(int u,int low)//深搜找增广路
{
int i,flow;
if(u==t)return low;//到达汇点
if(vis[u])return ;//节点访问过
vis[u]=;
for(i=;i<=n;i++)
if(c[u][i]&&(flow=dfs(i,low<c[u][i]?low:c[u][i])))
{
c[u][i]-=flow;
c[i][u]+=flow;
return flow;
}
return ;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie();
// cout<<setiosflags(ios::fixed)<<setprecision(2);
int T,cnt=;
cin>>T;
while(T--){
cin>>n>>m;
memset(c,,sizeof(c));
memset(vis,,sizeof(vis));
for(int i=;i<=m;i++)
{
int u,v,w;
cin>>u>>v>>w;
c[u][v]+=w;
}
t=n;//t是汇点
int maxflow=,flow;
while(flow=dfs(,inf))//当增广路还存在时
{
/* for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
cout<<c[i][j]<<" ";
cout<<endl;
}*/
maxflow+=flow;
memset(vis,,sizeof(vis));
}
cout<<"Case "<<++cnt<<": "<<maxflow<<endl;
}
return ;
}
Edmonds_Karp算法:bfs实现
bfs 156ms
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<cassert>
#include<iomanip>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pi acos(-1)
#define ll long long
#define mod 10007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; const double g=10.0,eps=1e-;
const int N=+,maxn=+,inf=; int t,n,m,pre[N];
bool vis[maxn];//判断是否访问过
int c[maxn][maxn];//邻接矩阵存图
bool bfs()//判断是否存在增广路,并求出
{
memset(vis,,sizeof vis);
memset(pre,,sizeof pre);
vis[]=;
queue<int>q;
q.push();
while(!q.empty()){
int x=q.front();
q.pop();
if(x==t)return ;
for(int i=;i<=n;i++)
{
if(!vis[i]&&c[x][i])
{
q.push(i);
pre[i]=x;//记录前驱
vis[i]=;
}
}
}
return ;
}
int max_flow()
{
int ans=;
while(){
if(!bfs())return ans;//找不到增广路了
int minn=;
for(int i=t;i!=;i=pre[i])
minn=min(minn,c[pre[i]][i]);//找出增广路中最小的节点
for(int i=t;i!=;i=pre[i])
{
c[pre[i]][i]-=minn;//更新残余网络
c[i][pre[i]]+=minn;
}
ans+=minn;
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie();
// cout<<setiosflags(ios::fixed)<<setprecision(2);
int k,cnt=;
cin>>k;
while(k--){
cin>>n>>m;
memset(c,,sizeof(c));
for(int i=;i<=m;i++)
{
int u,v,w;
cin>>u>>v>>w;
c[u][v]+=w;
}
t=n;//t是汇点
cout<<"Case "<<++cnt<<": "<<max_flow()<<endl;
}
return ;
}
dinic算法:dfs+bfs实现
171ms(我可能用的是假的dinic,居然这么慢,可能数据比较弱)
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<cassert>
#include<iomanip>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pi acos(-1)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; const double g=10.0,eps=1e-;
const int N=+,maxn=,inf=; int n,s,t;//超级源超级汇
int v[N][N],dis[N];
bool bfs()
{
memset(dis,-,sizeof dis);
queue<int>q;
q.push(s);
dis[s]=;
while(!q.empty()){
int x=q.front();
q.pop();
for(int i=;i<=n;i++)
{
if(v[x][i]&&dis[i]==-)
{
dis[i]=dis[x]+;
q.push(i);
}
}
}
if(dis[t]==-)return ;
return ;
}
int dfs(int x,int mx)
{
int a;
if(x==t)return mx;
for(int i=;i<=n;i++)
{
if(v[x][i]>&&dis[i]==dis[x]+&&(a=dfs(i,min(mx,v[x][i]))))
{
v[x][i]-=a;
v[i][x]+=a;
return a;
}
}
return ;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie();
int k,m,cnt=;
cin>>k;
while(k--){
cin>>n>>m;
memset(v,,sizeof v);
while(m--){
int a,b,c;
cin>>a>>b>>c;
v[a][b]+=c;
}
int ans=,flow;
s=,t=n;
while(bfs()){
while(flow=dfs(s,inf))ans+=flow;
}
cout<<"Case "<<++cnt<<": "<<ans<<endl;
}
return ;
}
hdu3549网络流之最大流的更多相关文章
- hdu 4940 Destroy Transportation system( 无源汇上下界网络流的可行流推断 )
题意:有n个点和m条有向边构成的网络.每条边有两个花费: d:毁坏这条边的花费 b:重建一条双向边的花费 寻找这样两个点集,使得点集s到点集t满足 毁坏全部S到T的路径的费用和 > 毁坏全部T到 ...
- 【Luogu2711】小行星(网络流,最大流)
[Luogu2711]小行星(网络流,最大流) 题面 题目描述 星云中有n颗行星,每颗行星的位置是(x,y,z).每次可以消除一个面(即x,y或z坐标相等)的行星,但是由于时间有限,求消除这些行星的最 ...
- 网络流之最大流Dinic算法模版
/* 网络流之最大流Dinic算法模版 */ #include <cstring> #include <cstdio> #include <queue> using ...
- 【BZOJ2324】[ZJOI2011]营救皮卡丘(网络流,费用流)
[BZOJ2324][ZJOI2011]营救皮卡丘(网络流,费用流) 题面 BZOJ 洛谷 题解 如果考虑每个人走的路径,就会很麻烦. 转过来考虑每个人破坏的点集,这样子每个人可以得到一个上升的序列. ...
- HDU 3416 Marriage Match IV (最短路径,网络流,最大流)
HDU 3416 Marriage Match IV (最短路径,网络流,最大流) Description Do not sincere non-interference. Like that sho ...
- HDU 3605 Escape (网络流,最大流,位运算压缩)
HDU 3605 Escape (网络流,最大流,位运算压缩) Description 2012 If this is the end of the world how to do? I do not ...
- HDU 3338 Kakuro Extension (网络流,最大流)
HDU 3338 Kakuro Extension (网络流,最大流) Description If you solved problem like this, forget it.Because y ...
- POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流)
POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流) Description Yo ...
- UVA 10480 Sabotage (网络流,最大流,最小割)
UVA 10480 Sabotage (网络流,最大流,最小割) Description The regime of a small but wealthy dictatorship has been ...
随机推荐
- Maven搭建Nexus私有仓库
下载压缩包nexus-2.13.0-01-bundle.tar.gz 解压后有两个目录 进入程序目录启动 ./nexus start 启动告警(确认用root启动把以下加入到环境变量) export ...
- Meaning of “const” last in a C++ method declaration?
函数尾部的const是什么意思? 1 Answer by Jnick Bernnet A "const function", denoted with the keyword co ...
- 为什么不要使用"using namespace XXX"
为什么不要使用"using namespace XXX" 1.避免降低性能 2.避免Entity冲突 This is not related to performance at a ...
- ArrayList遍历的三种方式 array arrayList转换
ArrayList遍历的三种方式 - 呵呵静 - 博客园 https://www.cnblogs.com/mjyung/p/6725182.html
- Linux内核之vmlinux与vmlinuz
因为是初次系统的学习Linux内核,过程中遇到了一些常常出现的名词.似曾相识,但对他们的含义又不是非常清楚.因此,将搜索到的内容进行一下汇总. 1.vmlinux vmlinux是一个包括linu ...
- python之轮询、长轮询、websocket
轮询 ajax轮询 ,ajax轮询 的原理非常简单,让浏览器隔个几秒就发送一次请求,询问服务器是否有新信息. 1.后端代码 from flask import Flask,render_templat ...
- 分页组件vue和jsp版本
vue版本 <template> <div class="com-vscroll"> <slot name="mcontent"& ...
- Redis快速入门之简介
一.Redis是什么? Redis 是一个开源(BSD许可)基于内存数据结构存储系统,它可以用作数据库.缓存和消息中间件. 它支持多种类型的数据结构,如字符串(strings), 散列(hashes) ...
- Linux查看网卡UUID另一方法
转自:http://liaoronghui.com/linux-view-network-adapter-uuid-other-law.html 有时我们不小心将/etc/sysconfig/netw ...
- Android 自定义View-字母索引表(一)
在有些Android应用中,为了方便快速定位,经常会看到屏幕右侧有一个字母索引表,今天尝试使用自定义View的方式实现了索引表的基本布局. 字母索引表的样式如下面的示意图所示, 此时我们至少需要知道以 ...