2021——网络流初步

首先是一些概念,容量,流量,饱和弧,非饱和弧,零弧,非零弧,增广路,残量,残量网络

1.Edmonds—Karp算法

这个方法的时间复杂度比较差 为O(VE^{2})

一直bfs找增广路,直到找不到算法结束,每次找到后,修改正向边和反向边的边权即可

 

代码

#include<bits/stdc++.h>
using namespace std;
int n,m,s,t;
const int inf=pow(2,31)-1;
const int maxm=5e3+3;
const int maxn=205;
vector <int> G[maxn];
long long ans,flow;
long long dis[maxn][maxn];
int pre[maxn];
void bfs()
{
	queue <int> q;
	q.push(s);
	flow=inf;
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		for(int k=0;k<G[u].size();k++)
		{
			int to=G[u][k];
			if(pre[to]==-1 && dis[u][to]>0)
			{
				pre[to]=u;
				flow=min(flow,dis[u][to]);
				if(to==t) break;
				q.push(to);
			}
		}
	}
}
void EK()
{
	while(1)
	{
		memset(pre,-1,sizeof(pre));
		bfs();
		if(pre[t]==-1) break;
		for(int i=t;i!=s;i=pre[i]) 
			dis[i][pre[i]]+=flow,dis[pre[i]][i]-=flow;
		ans+=flow;
	}
}
int main()
{
	freopen("a.in","r",stdin);
	freopen("a.out","w",stdout);
	scanf("%d%d%d%d",&n,&m,&s,&t);
	int x,y,z;
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		G[x].push_back(y);
		G[y].push_back(x);
		dis[x][y]+=z;
	}
	EK();
	printf("%lld\n",ans);
	return 0;
}

//这个EK再洛谷p3376上会T两个点

 

 

2.Dinic算法

首先通过bfs分层,然后用dfs多路同时增广

时间复杂度 O(V^{2}E)

 

代码

#include<bits/stdc++.h>
using namespace std;
int n,m,s,t;
const long long inf=1e18;
const int maxm=1e4+3;
const int maxn=205;
struct edge
{
	int to,nxt;
	long long v;
}e[maxm<<1];
long long ans,dis[maxn];
int head[maxn],cnt=1;
void add(int x,int y,int z)
{
	e[++cnt].to=y;
	e[cnt].nxt=head[x];
	e[cnt].v=z;
	head[x]=cnt;
}
bool bfs()
{
	memset(dis,-1,sizeof(dis)); 
	queue <int> q;
	q.push(s);
	dis[s]=0;
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		for(int i=head[u];i;i=e[i].nxt)
		{
			int to=e[i].to;
			if(dis[to]==-1 && e[i].v>0)
			{
				dis[to]=dis[u]+1;
				q.push(to);
			}
		}
	}
	return (dis[t]!=-1);
}
long long dfs(int x,long long flow)
{
	if(x==t) return flow;
	long long res=0;
	for(int i=head[x];i;i=e[i].nxt)
	{
		int to=e[i].to;
		if(e[i].v>0 && dis[to]==dis[x]+1)
		{
			long long tmp=dfs(to,min(flow,e[i].v));
			flow-=tmp; e[i].v-=tmp;
			res+=tmp; e[i^1].v+=tmp;
			//if(!flow) break;
		}
	}
	if(!res) dis[x]=-1;
	return res;
}
void dinic()
{
	while(bfs())
	{
		ans+=dfs(s,inf);
	}
}
int main()
{
	freopen("a.in","r",stdin);
	freopen("a.out","w",stdout);
	scanf("%d%d%d%d",&n,&m,&s,&t);
	int x,y;
	long long z;
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%lld",&x,&y,&z);
		add(x,y,z);
		add(y,x,0);
	}
	dinic();
	printf("%lld\n",ans);
	return 0;
}

写反向边 (^1) 的时候,cnt一定要从1开始啊,查了好长时间!!!

 

3.最大流最小割定理

就是最大流=最小割,建模时常用

 

4.dfs求割集

先用dinic求出最大流,然后dfs遍历剩余网络中所有被遍历的点存在集合S中即可

 

5.最小费用最大流

用spfa来找增广路增广,spfa的距离就是费用

 

代码

#include<bits/stdc++.h>
using namespace std;
int n,m,s,t;
const int maxn=5e3+5;
const int inf=pow(2,31)-1;
const int maxm=5e4+5;
struct edge
{
	int u,to,nxt,v,w;
}e[maxm<<1];
int head[maxn],cnt=1;
void add(int x,int y,int a,int b)
{
	e[++cnt].nxt=head[x];
	e[cnt].to=y;
	e[cnt].u=x;
	e[cnt].v=a;
	e[cnt].w=b;
	head[x]=cnt;
}
int vis[maxn],dis[maxn],pre[maxn];
bool spfa()
{
	memset(vis,0,sizeof(vis));
	memset(dis,0x3f,sizeof(dis));
	memset(pre,-1,sizeof(pre));
	dis[s]=0;
	queue <int> q;
	q.push(s);
	vis[s]=1;
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		vis[u]=0;
		for(int i=head[u];i!=-1;i=e[i].nxt)
		{
			if(!e[i].v) continue;
			int to=e[i].to;
			if(dis[u]+e[i].w<dis[to])
			{
				dis[to]=dis[u]+e[i].w;
				pre[to]=i;
				if(!vis[to])
				{
					q.push(to);
					vis[to]=1;
				}
			}
		}
	}
	return (pre[t]!=-1);
}
void mcmf()
{
	int ans=0,res=0;
	while(spfa())
	{
		int flow=inf;
		for(int i=t;i!=s;i=e[pre[i]^1].to)
			flow=min(flow,e[pre[i]].v);
		for(int i=t;i!=s;i=e[pre[i]^1].to)
		{
			e[pre[i]].v-=flow;
			e[pre[i]^1].v+=flow;
			res+=e[pre[i]].w*flow;
		}
		ans+=flow;
	}
	printf("%d %d\n",ans,res);
}
int main()
{
	freopen("a.in","r",stdin);
	freopen("a.out","w",stdout);
	scanf("%d%d%d%d",&n,&m,&s,&t);
	int x,y,z,w;
	memset(head,-1,sizeof(head));
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d%d",&x,&y,&z,&w);
		add(x,y,z,w); add(y,x,0,-w);
	}
	mcmf();
	return 0;
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
酷抓6是在原网址抓取器5.0的基础上全新升级、强势推出的。提供嗅探下载一条龙服务。可以在线抓取正在访问的所有网络资源并提供下载,比如图片、Flash、音乐、视频等。独有的完整HTTP请求包和响应包抓取分析功能,打造的就是超强的防盗链下载功能和精准的真实文件类型自动识别功能。独有的疑难网址下载功能,真正将所有网络资源一网打尽。 完全支持所有flv视频网站的下载、所有DJ网站、铃声网站的铃声下载,包括QQ音乐,QQ空间背景音乐的下载。酷抓的口号是:只要你能看到的,你能听到的,我都可以下载下来。 支持Windows2000/XP局域网、拨号上网、无线上网等所有网络形式。 更新历史: 2010-06-14 酷抓6.8.193.0614 终结版 ----------------------------------------- +增加RTMP/RTMPE录制功能 *全新的RTMP解析引擎 ----------------------------------------- +Add function of recording RTMP/RTMPE stream *New engine of RMTP analysis ----------------------------------------- 2010-05-29 刀锋下载5.0.322.0529 ----------------------------------------- *修正了下载某些RTMP时出错的问题 ----------------------------------------- *Fix some tiny problems when downloading RTMP streams ----------------------------------------- 2010-05-23 ----------------------------------------- 酷抓6.5.175.0523 刀锋下载5.0.315.0523 +增加对RTMPE协议的抓取和下载 +增加对RTMP码率切换抓取的支持 +改进退出时保存提示的体验 *修正了某些HTTP完整请求头抓取格式错误的BUG ----------------------------------------- CooJah 6.5.175.0523 Blader 5.0.315.0523 +Support RTMPE sniffing and downloading +Support RTMP stream bitrates switching sniffing +Optimize exit prompting *Correct format errors for some HTTP headers ----------------------------------------- 2010-02-28 ----------------------------------------- 刀锋下载4.6.251.0228 +刀锋下载支持下载电视直播类型rtmp协议 ----------------------------------------- Blader 4.6.251.0228 +Blader supports live tv rtmp download ----------------------------------------- 2010-01-17 ----------------------------------------- 酷抓6.1.128.0116 刀锋下载4.5.241.0116 +刀锋下载增加最小化至系统托盘和悬浮窗功能 *更正软件中相关错误链接 ----------------------------------------- CooJah 6.1.128.0116 Blader 4.5.241.0116 +Tray icon support for Blader when minimizing and floating window to show downloading status *correct some dead links ----------------------------------------- 2010-01-04 ----------------------------------------- 酷抓6.1.124.0104 刀锋下载4.5.168.0104 *修复一处酷抓对mmsh协议的网址分类错误的问题 +酷抓+刀锋配合支持mmsh下载 ----------------------------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值