网络吞吐量
(network)
题目描述
路由是指通过计算机网络把信息从源地址传输到目的地址的活动,也是计算机网络设计中的重点和难点。网络中实现
路由转发的硬件设备称为路由器。为了使数据包最快的到达目的地,路由器需要选择最优的路径转发数据包。例如,
在常用的路由算法OSPF(开放式最短路径优先)中,路由器会使用经典的Dijkstra算法计算最短路径,然后尽量沿最短
路径转发数据包。
现在,若已知一个计算机网络中各路由器间的连接情况,以及各个路由器的最大吞吐量(即每秒能转发的数据包数
量),假设所有数据包一定沿最短路径转发,试计算从路由器1到路由器n的网络的最大吞吐量。计算中忽略转发及传
输的时间开销,不考虑链路的带宽限制,即认为数据包可以瞬间通过网络。路由器1到路由器n作为起点和终点,自身
的吞吐量不用考虑,网络上也不存在将1和n直接相连的链路。
输入格式
输入文件第一行包含两个空格分开的正整数n和m,分别表示路由器数量和链路的数量。网络中的路由器使用1到n编
号。
接下来m行,每行包含三个空格分开的正整数a、b和d,表示从路由器a到路由器b存在一条距离为d的双向链路。
接下来n行,每行包含一个正整数c,分别给出每一个路由器的吞吐量。
输出格式
输出一个整数,为题目所求吞吐量。
输入样例
7 10
1 2 2
1 5 2
2 4 1
2 3 3
3 7 1
4 5 4
4 3 1
4 6 1
5 6 2
6 7 1
1
100
20
50
20
60
1
输出样例
70

思路:首先跑最一遍短路,然后显然网络流上的边得是必须边嘛,然后限制是在点上的,因此需要拆点,跑一边maxflow即可

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define maxn 400009
#define inf ((1LL<<63)-1)
#define ll long long
using namespace std;
ll head[maxn],next[maxn],point[maxn],now,p[maxn],flow[maxn];
ll n,m,value[maxn],dist[maxn],dis[maxn],x[maxn],y[maxn],v[maxn];
void add(ll x,ll y,ll v)
{
next[++now]=head[x];
head[x]=now;
point[now]=y;
value[now]=v;
}
void add2(ll x,ll y,ll v)
{
next[++now]=head[x];
head[x]=now;
point[now]=y;
flow[now]=v;
next[++now]=head[y];
head[y]=now;
point[now]=x;
flow[now]=;
}
void spfa(ll s)
{
memset(dist,-,sizeof(dist));
int visit[maxn]={};
visit[s]=;
queue<ll>q;
q.push(s);
dist[s]=;
while(!q.empty())
{
int u=q.front();
q.pop();
visit[u]=;
for(int i=head[u];i;i=next[i])
{
ll k=point[i];
if(dist[k]==- || dist[u]+value[i]<dist[k])
{
dist[k]=dist[u]+value[i];
p[k]=u;
if(!visit[k])
{
visit[k]=;
q.push(k);
}
}
}
}
}
int bfs(ll s,ll t)
{
queue<ll>q;
memset(dis,-,sizeof(dis));
q.push(s);
dis[s]=;
while(!q.empty())
{
ll u=q.front();
q.pop();
for(int i=head[u];i;i=next[i])
{
ll k=point[i];
if(dis[k]==- && flow[i])
{
dis[k]=dis[u]+;
q.push(k);
}
}
}
return dis[t]!=-;
}
ll dfs(ll s,ll d,ll t)
{
if(s==t)return d;
ll res=;
for(int i=head[s];i&&res<d;i=next[i])
{
ll u=point[i];
if(flow[i] && dis[u]==dis[s]+)
{
ll dd=dfs(u,min(flow[i],d-res),t);
if(dd)
{
flow[i]-=dd;
flow[((i-)^)+]+=dd;
res+=dd;
}
}
}
if(res==)dis[s]=-;
return res;
}
int main()
{
scanf("%lld%lld",&n,&m);
for(int i=;i<=m;i++)
{
scanf("%lld%lld%lld",&x[i],&y[i],&v[i]);
add(x[i],y[i],v[i]);
add(y[i],x[i],v[i]);
}
spfa();
memset(head,,sizeof(head));now=;
for(int i=;i<=m;i++)
{
if(dist[x[i]] + v[i] == dist[y[i]])
{
add2(x[i]+n,y[i],inf);
}
if(dist[y[i]] + v[i] == dist[x[i]])
{
add2(y[i]+n,x[i],inf);
}
}
ll b;
for(int i=;i<=n;i++)
{
scanf("%lld",&b);
add2(i,i + n,(i==||i==n)?inf:b);
}
ll ans=;
while(bfs( ,n + n))
{
ans += dfs( ,inf ,n + n);
}
printf("%lld\n",ans);
return ;
}

3931: [CQOI2015]网络吞吐量【网络流】的更多相关文章

  1. bzoj 3931: [CQOI2015]网络吞吐量 -- 最短路+网络流

    3931: [CQOI2015]网络吞吐量 Time Limit: 10 Sec  Memory Limit: 512 MB Description 路由是指通过计算机网络把信息从源地址传输到目的地址 ...

  2. BZOJ 3931: [CQOI2015]网络吞吐量

    3931: [CQOI2015]网络吞吐量 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1555  Solved: 637[Submit][Stat ...

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

    3931: [CQOI2015]网络吞吐量 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...

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

    最短路 + 最大流 , 没什么好说的... 因为long long WA 了两次.... ------------------------------------------------------- ...

  5. 3931: [CQOI2015]网络吞吐量

    3931: [CQOI2015]网络吞吐量 链接 分析: 跑一遍dijkstra,加入可以存在于最短路中的点,拆点最大流. 代码: #include<cstdio> #include< ...

  6. bzoj 3931 [CQOI2015]网络吞吐量(最短路,最大流)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3931 [题意] 只能通过1-n的最短路,求网络最大流 [思路] 分别以1,n为起点做最 ...

  7. ●BZOJ 3931 [CQOI2015]网络吞吐量

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3931 题解: 在最短路图上跑网络流,要开long long(无奈 BZOJ AC 不了,洛谷 ...

  8. BZOJ 3931 [CQOI2015]网络吞吐量:最大流【拆点】

    传送门 题意 给你一个 $ n $ 个点,$ m $ 条边的无向网络,每条边有长度.每个点的流量限制为 $ c[i] $ . 要求流量只能经过从 $ 1 $ 的 $ n $ 的最短路.问你最大流是多少 ...

  9. BZOJ 3931: [CQOI2015]网络吞吐量 Dijkstra+最大流

    这个没啥难的. 只保留可以转移最短路的边,然后拆点跑一个最大流即可. #include <bits/stdc++.h> #define N 1004 #define M 250004 #d ...

随机推荐

  1. Java静态方法不能被覆盖

    // 静态方法不能被覆盖   /*class Super{     static String name(){         return "mother";     } }   ...

  2. 这么大一座Azure“图书馆”,你竟没有发现…

    为避免被叫做「伸手党」,很多技术人员早已养成遇到问题上网搜的好习惯. 然而…… 同一个概念,搜到两个相互矛盾的解释,以谁的为准? 想查找某个 API 的用法,搜索结果数十万条,怎样筛选出最有价值的? ...

  3. 【数据库-Azure SQL Database】如何创建事务复制将本地数据同步到 SQL Azure

    Azure SQL DB 可以被配置成为 SQL Server 事务复制的一个订阅者( subscriber ). 主要应用场景有两种: 将您的数据迁移到 Azure SQL DB, 并且没有宕机时间 ...

  4. C#操作Txt(追加模式)

    /// <summary> /// 输出指定信息到文本文件 /// </summary> /// <param name="msg">输出信息& ...

  5. webpack前端构建工具学习总结(四)之自动化生成项目中的html页面

    接续上文:webpack前端构建工具学习总结(三)之webpack.config.js配置文件 插件的介绍文档:https://www.npmjs.com/package/html-webpack-p ...

  6. OPENFIRE 接收数据流程图

    此图网上已经有,怎奈我不能上传大于10M的图片,所以截图了!各位请脑补!

  7. HTML5微信播放全屏问题的解决方法

    在ios和安卓手机里的微信下播放视频时,会遇到不少问题,例如需要手动点击,视频才会播放,并且视频会跳出微信框,出现控制条,如果视频不是腾讯视频,播放完毕会出现腾讯视频的广告推送等问题 解决办法:给vi ...

  8. 利用enum4linux 445端口+wordpress插件任意文件上传的一次渗透

    探测内网80端口发现目标IP 目标使用Apache  2.4.7web服务中间件 使用linux    Ubuntu系统 使用御剑扫描了目录 目录扫描到了 http://192.168.31.236/ ...

  9. ES6新增rest的用法

    arguments类似Array但是并不是Array 而rest就是一个Array 用rest替代atguments eg:给数组排序 //arguments变量的写法: function sortF ...

  10. C++ _ const的用法,特别是用在函数前面与后面的区别!

    在普通的非 const成员函数中 this的类型是一个指向类类型的 const指针.可以改变this所指向的值,但不能改变 this所保存的地址. 在 const成员函数中 this的类型是一个指向 ...