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网络流之最大流的更多相关文章

  1. hdu 4940 Destroy Transportation system( 无源汇上下界网络流的可行流推断 )

    题意:有n个点和m条有向边构成的网络.每条边有两个花费: d:毁坏这条边的花费 b:重建一条双向边的花费 寻找这样两个点集,使得点集s到点集t满足 毁坏全部S到T的路径的费用和 > 毁坏全部T到 ...

  2. 【Luogu2711】小行星(网络流,最大流)

    [Luogu2711]小行星(网络流,最大流) 题面 题目描述 星云中有n颗行星,每颗行星的位置是(x,y,z).每次可以消除一个面(即x,y或z坐标相等)的行星,但是由于时间有限,求消除这些行星的最 ...

  3. 网络流之最大流Dinic算法模版

    /* 网络流之最大流Dinic算法模版 */ #include <cstring> #include <cstdio> #include <queue> using ...

  4. 【BZOJ2324】[ZJOI2011]营救皮卡丘(网络流,费用流)

    [BZOJ2324][ZJOI2011]营救皮卡丘(网络流,费用流) 题面 BZOJ 洛谷 题解 如果考虑每个人走的路径,就会很麻烦. 转过来考虑每个人破坏的点集,这样子每个人可以得到一个上升的序列. ...

  5. HDU 3416 Marriage Match IV (最短路径,网络流,最大流)

    HDU 3416 Marriage Match IV (最短路径,网络流,最大流) Description Do not sincere non-interference. Like that sho ...

  6. HDU 3605 Escape (网络流,最大流,位运算压缩)

    HDU 3605 Escape (网络流,最大流,位运算压缩) Description 2012 If this is the end of the world how to do? I do not ...

  7. HDU 3338 Kakuro Extension (网络流,最大流)

    HDU 3338 Kakuro Extension (网络流,最大流) Description If you solved problem like this, forget it.Because y ...

  8. POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流)

    POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流) Description Yo ...

  9. UVA 10480 Sabotage (网络流,最大流,最小割)

    UVA 10480 Sabotage (网络流,最大流,最小割) Description The regime of a small but wealthy dictatorship has been ...

随机推荐

  1. SaltStack配置管理-jinja模板

    上一篇:SaltStack配置管理-状态间关系 需求:需要apache配置文件里面监听的端口是每个minion本地的地址 saltstack默认的模板是jinjia模板 参考文档:http://doc ...

  2. poj1961 & hdu1358 Period【KMP】

    Period Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 20436   Accepted: 9961 Descripti ...

  3. poj1952 BUY LOW, BUY LOWER【线性DP】【输出方案数】

    BUY LOW, BUY LOWER Time Limit: 1000MS   Memory Limit: 30000K Total Submissions:11148   Accepted: 392 ...

  4. 【JEECG技术博文】JEECG表单配置-树形表单

    表单配置支持树型表单了,详细效果例如以下图:

  5. 存储5——逻辑卷管理LVM

    1. LVM概念 LVM是 Logical Volume Manager(逻辑卷管理)的简写,它由Heinz Mauelshagen在Linux 2.4内核上实现.LVM将一个或多个硬盘的分区在逻辑上 ...

  6. Mirror--自增键在镜像中的影响

    测试环境: OS: Windows Server 2008 R2 Enterprise SQL: SQL Server 2012 Enterprise 测试场景: 有SERVER A上数据库 DB10 ...

  7. zcash 的资料

    我的比特币使用的是 electrum 2.9.3 版本.我的zcash用的是 jaxx 1.2 版. zcash又叫zec,可以在 bithumb (韩国的) 平台上进行交易zcash. zcash ...

  8. sql用法

    1:  SELECT `SCHEMA_NAME`  FROM `information_schema`.`SCHEMATA`;    查询sql中的数据库名 2:  select * from for ...

  9. Selenium之IE浏览器的启动

    1.下载IEDriverServer.exe文件放至需要的目录中: 2.编写代码 import org.openqa.selenium.WebDriver; import org.openqa.sel ...

  10. 120. Triangle(动态规划 三角形最小路径 难 想)

    Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent n ...