3931: [CQOI2015]网络吞吐量

Time Limit: 10 Sec  Memory Limit: 512 MB
Submit: 1555  Solved: 637
[Submit][Status][Discuss]

Description

路由是指通过计算机网络把信息从源地址传输到目的地址的活动,也是计算机网络设计中的重点和难点。网络中实现路由转发的硬件设备称为路由器。为了使数据包最快的到达目的地,路由器需要选择最优的路径转发数据包。例如在常用的路由算法OSPF(开放式最短路径优先)中,路由器会使用经典的Dijkstra算法计算最短路径,然后尽量沿最短路径转发数据包。现在,若已知一个计算机网络中各路由器间的连接情况,以及各个路由器的最大吞吐量(即每秒能转发的数据包数量),假设所有数据包一定沿最短路径转发,试计算从路由器1到路由器n的网络的最大吞吐量。计算中忽略转发及传输的时间开销,不考虑链路的带宽限制,即认为数据包可以瞬间通过网络。路由器1到路由器n作为起点和终点,自身的吞吐量不用考虑,网络上也不存在将1和n直接相连的链路。

 

Input

输入文件第一行包含两个空格分开的正整数n和m,分别表示路由器数量和链路的数量。网络中的路由器使用1到n编号。接下来m行,每行包含三个空格分开的正整数a、b和d,表示从路由器a到路由器b存在一条距离为d的双向链路。 接下来n行,每行包含一个正整数c,分别给出每一个路由器的吞吐量。

 

Output

输出一个整数,为题目所求吞吐量。

 

Sample Input

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

Sample Output

70

HINT

对于100%的数据,n≤500,m≤100000,d,c≤10^9

Source

 

[Submit][Status][Discuss]

分别从1和n点做单源最短路,即可求出哪些边出现在了从1到n的最短路上(最短路不一定唯一)。将这些边加入网络流中,对于原本的点拆点,入点向出点连限制吞吐量容量的边,跑最大流。注意Int64。

 #include <cstdio>
#include <cstring> #define int long long inline int nextChar(void) {
const int siz = ;
static char buf[siz];
static char *hd = buf + siz;
static char *tl = buf + siz;
if (hd == tl)
fread(hd = buf, , siz, stdin);
return *hd++;
} inline int nextInt(void) {
register int ret = ;
register int neg = false;
register int bit = nextChar();
for (; bit < ; bit = nextChar())
if (bit == '-')neg ^= true;
for (; bit > ; bit = nextChar())
ret = ret * + bit - ;
return neg ? -ret : ret;
} const int inf = 2e18;
const int siz = ; int n, m; struct edge {
int x, y, w;
}e[siz]; int lim[siz]; namespace shortestPath
{
int dis[][siz]; int edges;
int hd[siz];
int to[siz];
int nt[siz];
int vl[siz]; inline void add(int u, int v, int w) {
nt[edges] = hd[u]; to[edges] = v; vl[edges] = w; hd[u] = edges++;
nt[edges] = hd[v]; to[edges] = u; vl[edges] = w; hd[v] = edges++;
} inline void spfa(int *d, int s) {
static int que[siz];
static int inq[siz];
static int head, tail;
memset(inq, , sizeof(inq));
for (int i = ; i < siz; ++i)d[i] = inf;
inq[que[head = d[s] = ] = s] = tail = ;
while (head != tail) {
int u = que[head++], v; inq[u] = ;
for (int i = hd[u]; ~i; i = nt[i])
if (d[v = to[i]] > d[u] + vl[i]) {
d[v] = d[u] + vl[i];
if (!inq[v])inq[que[tail++] = v] = ;
}
}
} inline void solve(void) {
memset(hd, -, sizeof(hd));
for (int i = ; i <= m; ++i)
add(e[i].x, e[i].y, e[i].w);
spfa(dis[], );
spfa(dis[], n);
}
} namespace networkFlow
{
int s, t;
int edges;
int hd[siz];
int to[siz];
int nt[siz];
int fl[siz]; inline void add(int u, int v, int f) {
nt[edges] = hd[u]; to[edges] = v; fl[edges] = f; hd[u] = edges++;
nt[edges] = hd[v]; to[edges] = u; fl[edges] = ; hd[v] = edges++;
} int dep[siz]; inline bool bfs(void) {
static int que[siz], head, tail;
memset(dep, , sizeof(dep));
dep[que[head = ] = s] = tail = ;
while (head != tail) {
int u = que[head++], v;
for (int i = hd[u]; ~i; i = nt[i])
if (fl[i] && !dep[v = to[i]])
dep[que[tail++] = v] = dep[u] + ;
}
return dep[t];
} int lst[siz]; int dfs(int u, int f) {
if (u == t || !f)return f;
int used = , flow, v;
for (int i = lst[u]; ~i; i = nt[i])
if (dep[v = to[i]] == dep[u] + ) {
flow = dfs(v, f - used < fl[i] ? f - used : fl[i]);
used += flow;
fl[i] -= flow;
fl[i^] += flow;
if (fl[i])lst[u] = i;
if (used == f)return f;
}
if (!used)dep[u] = ;
return used;
} inline int maxFlow(void) {
int maxFlow = , newFlow;
while (bfs()) {
for (int i = s; i <= t; ++i)
lst[i] = hd[i];
while (newFlow = dfs(s, inf))
maxFlow += newFlow;
}
return maxFlow;
} inline void solve(void) {
s = , t = (n + ) << ;
memset(hd, -, sizeof(hd));
add(s, << , inf);
add(n << | , t, inf);
for (int i = ; i <= n; ++i)
add(i << , i << | , lim[i]);
for (int i = ; i <= m; ++i) {
int x, y, d = shortestPath::dis[][n];
x = shortestPath::dis[][e[i].x];
y = shortestPath::dis[][e[i].y];
if (x + y + e[i].w == d)
add(e[i].x << | , e[i].y << , inf);
x = shortestPath::dis[][e[i].y];
y = shortestPath::dis[][e[i].x];
if (x + y + e[i].w == d)
add(e[i].y << | , e[i].x << , inf);
}
printf("%lld\n", maxFlow());
}
} signed main(void) {
n = nextInt();
m = nextInt();
for (int i = ; i <= m; ++i)
e[i].x = nextInt(),
e[i].y = nextInt(),
e[i].w = nextInt();
for (int i = ; i <= n; ++i)
lim[i] = nextInt();
lim[] = lim[n] = inf;
shortestPath::solve();
networkFlow::solve();
}

@Author: YouSiki

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    网络吞吐量(network)题目描述路由是指通过计算机网络把信息从源地址传输到目的地址的活动,也是计算机网络设计中的重点和难点.网络中实现路由转发的硬件设备称为路由器.为了使数据包最快的到达目的地,路 ...

随机推荐

  1. Java--String 和StringBuilder、StringBuffer 的区别?

    1.String是只读字符串,引用的字符串内容是无法改变的. 2.StringBuffer和StringBuilder的字符串对象可以直接进行修改. 3.StringBuilder没有被synchro ...

  2. JSON金额解析BUG的解决过程

    [原创申明:文章为原创,欢迎非盈利性转载,但转载必须注明来源] 这是在我们开发的一个支付系统中暴露的一个BUG,问题本身比较简单,有意思的是解决问题的过程.将过程分享出来,希望能够对大家有所帮助. 一 ...

  3. [已解决]Windows10 系统下HDMI 显示器 没有声音输出的奇怪问题

    今天想用一下显示器自带的喇叭,忽然发现声音输出选项里HDMI的声音设备没了.之前开始使用这台显示器的时是用过一段时间的. 百度了一番,没发现什么线索.后来去谷歌找到这么一段文字: I'm not su ...

  4. mongodb 性能篇

    一.  索引及其优化 索引的概述 数据库的索引好比是一本书前面的目录,能加快数据查询的速度. 适当的地方增加索引,不合理的地方删除次优索引,能优化性能较差的应用. 索引的操作 基础索引:db.ken. ...

  5. 未能加载文件或程序集“System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。系统找不到指定的文件

    ASP.NET 运行时错误:针对类型System.Web.Mvc.PreApplicationStartCode的应用程序邓启动初始化方法Start 引发了异常,显示下列错误消息: 未能加载文件或程序 ...

  6. 索引超出了数组界限(Microsoft.SqlServer.Smo)

    SSMS连接远程SQL Server服务器是很方便的. 昨天我用SQL Server 2008 SSMS连接SQL Server 2012竟然报错,如下图: 在网上搜了,参考这个参考那个,太啰嗦了,确 ...

  7. phpstudy配置伪静态的方法

    mod_rewrite是Apache的一个非常强大的功能,它可以实现伪静态页面.下面我详细说说它的使用方法1.检测Apache是否支持mod_rewrite通过php提供的phpinfo()函数查看环 ...

  8. linux 项目部署问题

    1.ubuntu 安装 pillow 报错 缺少依赖包 pip install Pillow ValueError: zlib is required unless explicitly disabl ...

  9. [原]在GeoServer中为OpenStreetMap数据设置OSM样式

    转载请注明作者think8848和出处(http://think8848.cnblogs.com) 在前面几篇文章中,我们讲到了部署Postgresql,部署PostGis,部署GeoServer以及 ...

  10. [LeetCode] Basic Calculator II 基本计算器之二

    Implement a basic calculator to evaluate a simple expression string. The expression string contains ...