bzoj-3931 网络吞吐量

题意:

给出一个n个结点的无向图,每个结点有一个吞吐量;

规则是数据包传递一定按照最短路,求1到n的网络吞吐量;

题解:

正如黄学长所说,此题题意即题解;

但是还是有几点需要注意的;

最短路是dij还是spfa都可以,但是为了建图需要记录一下路径;

如果用链式前向星可以将所有用来更新的边存下来建图;

但是用vector或者邻接矩阵(不知道能不能过)存边就不能实现;

我是用一个vector数组上面挂链;

拓扑队列扫一遍加边,复杂度挺低就过了;

然后拆点建图就没什么说的了;

最短路和流量都要开long long,第一个和最后一个点的吞吐量不用计入;

代码:

#include<queue>
#include<vector>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define pr pair<int,int>
#define N 600
#define M 210000
using namespace std;
typedef long long ll;
queue<int>q;
priority_queue<pr,vector<pr >,greater<pr > >poq;
vector<int>to[N],pre[N];
vector<ll>val[N];
int head[N<<1],next[M],T[M],n,tot=1;
ll dis[N<<1],flow[M];
bool vis[N];
void add(int x,int y,ll fl)
{
	T[++tot]=y,next[tot]=head[x],head[x]=tot,flow[tot]=fl;
	T[++tot]=x,next[tot]=head[y],head[y]=tot,flow[tot]=0;
}
void dij()
{
	memset(dis,0x3f,sizeof(dis));
	dis[1]=0;
	poq.push(pr(0,1));
	int x,y,i;
	while(!poq.empty())
	{
		x=poq.top().second,poq.pop();
		if(vis[x])	continue;
		vis[x]=1;
		for(i=0;i<to[x].size();i++)
		{
			if(!vis[y=to[x][i]])
			{
				if(dis[y]>dis[x]+val[x][i])
				{
					dis[y]=dis[x]+val[x][i];
					poq.push(pr(dis[y],y));
					pre[y].clear();
					pre[y].push_back(x);
				}
				else if(dis[y]==dis[x]+val[x][i])
					pre[y].push_back(x);
			}
		}
	}
}
bool bfs()
{
	memset(dis,-1,sizeof(dis));
	dis[3]=0;
	q.push(3);
	int x,y,i;
	while(!q.empty())
	{
		x=q.front(),q.pop();
		for(i=head[x];i;i=next[i])
		{
			if(flow[i]>0&&dis[y=T[i]]<0)
			{
				dis[y]=dis[x]+1;
				q.push(y);
			}
		}
	}
	return dis[n<<1]>=0;
}
ll dfs(int x,ll k)
{
	if(x==(n<<1))	return k;
	int y,i;
	ll j,ret=0;
	for(i=head[x];i;i=next[i])
	{
		if(flow[i]>0&&dis[y=T[i]]==dis[x]+1)
		{
			j=dfs(y,min(flow[i],k-ret));
			flow[i]-=j,flow[i^1]+=j;
			ret+=j;
			if(k==ret)	return ret;
		}
	}
	return ret;
}
int main()
{
	int m,i,j,k,x,y;
	ll v,ans;
	scanf("%d%d",&n,&m);
	for(i=1;i<=m;i++)
	{
		scanf("%d%d%lld",&x,&y,&v);
		to[x].push_back(y),val[x].push_back(v);
		to[y].push_back(x),val[y].push_back(v);
	}
	dij();
	q.push(n);
	memset(vis,0,sizeof(vis));
	while(!q.empty())
	{
		x=q.front(),q.pop();
		for(i=0;i<pre[x].size();i++)
		{
			y=pre[x][i];
			add(y<<1|1,x<<1,0x3f3f3f3f3f3f3f3fll);
			if(!vis[y])
				vis[y]=1,q.push(y);
		}
	}
	for(i=1;i<=n;i++)
		scanf("%lld",&v),
		add(i<<1,i<<1|1,v);
	ans=0;
	while(bfs())
		ans+=dfs(3,0x3f3f3f3f3f3f3f3fll);
	printf("%lld",ans);
	return 0;
}
时间: 2024-08-05 07:02:48

bzoj-3931 网络吞吐量的相关文章

【BZOJ】【3931】【CQOI2015】网络吞吐量

最短路+最大流 思维难度并不高,其实题面几乎已经把算法讲完了…… 练习模板的好题= = 哦对了,求最短路和最大流的时候都得开long long……QwQ 1 /************************************************************** 2 Problem: 3931 3 User: Tunix 4 Language: C++ 5 Result: Accepted 6 Time:316 ms 7 Memory:12256 kb 8 ********

BZOJ 3931: [CQOI2015]网络吞吐量

3931: [CQOI2015]网络吞吐量 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1555  Solved: 637[Submit][Status][Discuss] Description 路由是指通过计算机网络把信息从源地址传输到目的地址的活动,也是计算机网络设计中的重点和难点.网络中实现路由转发的硬件设备称为路由器.为了使数据包最快的到达目的地,路由器需要选择最优的路径转发数据包.例如在常用的路由算法OSPF(开放式最短路径优先)中

BZOJ 3931: [CQOI2015]网络吞吐量( 最短路 + 最大流 )

最短路 + 最大流 , 没什么好说的... 因为long long WA 了两次.... ------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<vector> #include<iostre

BZOJ 3931: [CQOI2015]网络吞吐量 最大流

3931: [CQOI2015]网络吞吐量 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=3931 Description 路由是指通过计算机网络把信息从源地址传输到目的地址的活动,也是计算机网络设计中的重点和难点.网络中实现路由转发的硬件设备称为路由器.为了使数据包最快的到达目的地,路由器需要选择最优的路径转发数据包.例如在常用的路由算法OSPF(开放式最短

bzoj 3931: [CQOI2015]网络吞吐量(最短路+网络流)

3931: [CQOI2015]网络吞吐量 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 1194  Solved: 508 [Submit][Status][Discuss] Description 路由是指通过计算机网络把信息从源地址传输到目的地址的活动,也是计算机网络设计中的重点和难点.网络中实现路由转发的硬件设备称为路由器.为了使数据包最快的到达目的地,路由器需要选择最优的路径转发数据包.例如在常用的路由算法OSPF(开放式最短路径优先

3931: [CQOI2015]网络吞吐量【网络流】

网络吞吐量(network)题目描述路由是指通过计算机网络把信息从源地址传输到目的地址的活动,也是计算机网络设计中的重点和难点.网络中实现路由转发的硬件设备称为路由器.为了使数据包最快的到达目的地,路由器需要选择最优的路径转发数据包.例如,在常用的路由算法OSPF(开放式最短路径优先)中,路由器会使用经典的Dijkstra算法计算最短路径,然后尽量沿最短路径转发数据包.现在,若已知一个计算机网络中各路由器间的连接情况,以及各个路由器的最大吞吐量(即每秒能转发的数据包数量),假设所有数据包一定沿最

【BZOJ-3931】网络吞吐量 最短路 + 最大流

3931: [CQOI2015]网络吞吐量 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1228  Solved: 524[Submit][Status][Discuss] Description 路由是指通过计算机网络把信息从源地址传输到目的地址的活动,也是计算机网络设计中的重点和难点.网络中实现路由转发的硬件设备称为路由器.为了使数据包最快的到达目的地,路由器需要选择最优的路径转发数据包.例如在常用的路由算法OSPF(开放式最短路径优先)中

bzoj3931: [CQOI2015]网络吞吐量

将最短路图找出来,跑maxflow即可.有注意到数据范围.然后输出的时候%dWA了三次QAQ... #include<cstdio> #include<cstring> #include<iostream> #include<queue> #include<algorithm> using namespace std; #define rep(i,n) for(int i=1;i<=n;i++) #define ll long long #

bzoj3931【CQOI2015】网络吞吐量

3931: [CQOI2015]网络吞吐量 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 853  Solved: 381 [Submit][Status][Discuss] Description 路由是指通过计算机网络把信息从源地址传输到目的地址的活动,也是计算机网络设计中的重点和难点.网络中实现路由转发的硬件设备称为路由器.为了使数据包最快的到达目的地,路由器需要选择最优的路径转发数据包.例如在常用的路由算法OSPF(开放式最短路径优先)