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 ...
随机推荐
- 分布式锁的实现(java)
当对接第三方接口时,往往会碰到同一时间发送了大量相同的请求,这个时候或许就是第三方发送接口的失误了.而我们需要做的就是针对这个情况来强化我们的系统.这个时候就需要用到分布式锁.让这些请求只有一个能发送 ...
- C++和C#的思考
从2011年从业至今已经写了7年C++了,而C#.go语言虽然早有涉猎,但直到最近才开始思考语言的发展和工程之间的关系. C++ 更容易写出高内聚代码使用指针做原地内存操作直接堆栈控制,减少内存分配, ...
- ubuntu下完全卸载opencv3.1.0
在ubuntu下删除opencv需要以下步骤: 1.进入opencv的源代码文件夹下的release(这是你在安装opencv时候自己命名的,cmake时候所在的目录) 2.执行以下命令 sudo m ...
- xplan-打印执行顺序
-- ------------------------------------------------------------------------------------------------- ...
- CVP沙龙
关于职场: 35岁之后,还去招聘网站投简历? 35岁可能是个分水岭 95后比一些80后还强, 有些80后玻璃心 35岁有的可能已经是VP了 应该深入积累而不是蜻蜓点水 只有第一年成长了,之后是重复劳动 ...
- 前端~HTML~CSS~JavaScript~JQuery~Vue
HTML CSS JavaScript DOM文档操作 jQuery实例 Vue
- 怎么在Linux上抓包分析
怎么在Linux上抓包分析 1.在Linux上抓包 例如在Ubuntu上,用命令抓包, tcpdump tcp -i any -s0 -w desk.cap 用 sz desk.cap 把数据包 ...
- Java8新特性(转载)
1.Lambda表达式 Lambda表达式(也称为闭包)是整个Java 8发行版中最受期待的在Java语言层面上的改变.使用 Lambda 表达式可以使代码变的更加简洁紧凑. Lambda允许把函数作 ...
- php计算中英文混合或中文字符串的字数
转载来源链接: http://blog.csdn.net/hueise_h/article/details/22920937 php的strlen和mb_strlen用于统计字符个数.中英文混合的字符 ...
- 常用linux shell脚本记录
遍历目录下所有的文件是目录还是文件 for file in ./* do if test -f $file then echo $file 是文件 fi if test -d $file then e ...