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 ...
随机推荐
- php 判断变量函数
1.isset功能:判断变量是否被初始化 判断变量是否被定义了 2.empty功能:检测变量是否为"空" 说明:任何一个未初始化的变量.值为 0 或 false 或 空字符串&qu ...
- JS替换URL中参数示例
<script type="text/javascript"> var url = window.location.href; url = changeURLArg(u ...
- Oracle下select语句
先看scott下自带的emp表 empno:编号 ename:名字 Job:职位 mgr:上级编号 hiredate:入职时间 sal:薪水 comm:奖金 deptno:部门编号 部门表dep ...
- Oracle Schema Objects——PARTITION
Oracle Schema Objects 表分区 表- - 分区( partition )TABLE PARTITION 一段时间给出一个分区,这样方便数据的管理. 可以按照范围range分区,列表 ...
- Chinese_remainder_theorem
https://en.wikipedia.org/wiki/Chinese_remainder_theorem 中国剩余定理 https://en.wikipedia.org/wiki/RSA_(cr ...
- Python爬虫框架Scrapy实例(一)
目标任务:爬取腾讯社招信息,需要爬取的内容为:职位名称,职位的详情链接,职位类别,招聘人数,工作地点,发布时间. 一.创建Scrapy项目 scrapy startproject Tencent 命令 ...
- toml-lang - Tom's Obvious, Minimal Language
Tom's Obvious, Minimal Languagehttps://github.com/toml-lang/toml
- F(N)---hdu2802(寻找循环节)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2802 f[1] = 1; f[2] = 7; f[n] = (f[n-2] - (n-1)*(n-1) ...
- 【Loadrunner】通过loadrunner录制时候有事件但是白页无法出来登录页怎么办?
loadrunner录制脚本时候有事件但是一直白页怎么办? 解决办法:依次进行下方1.2.方法操作,如果还不行再进行3的操作. 1.勾选下图IE浏览器的Internet选项中“启用第三方浏览器拓展*” ...
- python 面向对象 类 __doc__
用来打印类的描述信息 class A1(object): '''类的描述信息''' print(A1.__doc__) # 类的描述信息