BZOJ 3931 网络吞吐量(最短路+拆点最大流)
3931: [CQOI2015]网络吞吐量
Time Limit: 10 Sec Memory Limit: 512 MB
Submit: 1607 Solved: 652
[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
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
HINT
对于100%的数据,n≤500,m≤100000,d,c≤10^9
题目链接:BZOJ 3931
由于一个路由器视为一个点而不是一条边因此要把路由器$i$拆成$i$与$i+n$的一条边,容量为该路由器吞吐量,然后跑个最短路在遍历所有边,若d[v]-d[u]==e[i].dist则说明这条边在最短路上,把它加入网络中,嗯这样一来绝壁1A啊,然后就怀疑人生了,输出结果居然是1,又滚回去看了下题目数据发现很奇怪,为什么起始点的吞吐量只有1答案却有70,最后发现是“自身的吞吐量不用考虑”这句话的问题,所以将起点和终点的吞吐量变为无穷大即可,数组大小根据拆点范围和for的循环关系可以得到。对了linux下的longlong用lld,然后inf用longlong下的memset设定的inf即可,
这题无穷大的值一定要设好,不然可能会WA
代码:
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define LC(x) (x<<1)
#define RC(x) ((x<<1)+1)
#define MID(x,y) ((x+y)>>1)
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);
typedef pair<int, int> pii;
typedef long long LL;
const double PI = acos(-1.0);
const int N = 510;
const int M = 100010;
struct Edge
{
int to, nxt;
LL dx;
Edge() {}
Edge(int To, int Nxt, LL Dx): to(To), nxt(Nxt), dx(Dx) {}
};
struct edge
{
int to, nxt;
LL cap;
edge() {}
edge(int To, int Nxt, LL Cap): to(To), nxt(Nxt), cap(Cap) {}
}; Edge E[M << 1];
edge e[(N + 2 * M) << 1];
int head[N], h[N << 1], tot, rtot;
int d[N << 1];
LL dis[N];
bitset<N>vis;
LL pos[N]; void init()
{
CLR(head, -1);
CLR(h, -1);
rtot = 0;
tot = 0;
CLR(dis, INF);
vis.reset();
CLR(pos, 0);
}
inline void addE(int s, int t, LL dx)
{
E[tot] = Edge(t, head[s], dx);
head[s] = tot++;
}
inline void adde(int s, int t, LL cap)
{
e[rtot] = edge(t, h[s], cap);
h[s] = rtot++;
e[rtot] = edge(s, h[t], 0LL);
h[t] = rtot++;
}
void spfa(int s)
{
queue<int>q;
q.push(s);
dis[s] = 0LL;
vis[s] = true;
while (!q.empty())
{
int u = q.front();
q.pop();
vis[u] = false;
for (int i = head[u]; ~i; i = E[i].nxt)
{
int v = E[i].to;
if (dis[v] > dis[u] + E[i].dx)
{
dis[v] = dis[u] + E[i].dx;
if (!vis[v])
{
vis[v] = true;
q.push(v);
}
}
}
}
}
int bfs(int s, int t)
{
CLR(d, -1);
d[s] = 0;
queue<int>q;
q.push(s);
while (!q.empty())
{
int u = q.front();
q.pop();
for (int i = h[u]; ~i; i = e[i].nxt)
{
int v = e[i].to;
if (d[v] == -1 && e[i].cap > 0LL)
{
d[v] = d[u] + 1;
if (v == t)
return 1;
q.push(v);
}
}
}
return ~d[t];
}
LL dfs(int s, int t, LL f)
{
if (s == t || !f)
return f;
LL ret = 0LL;
for (int i = h[s]; ~i; i = e[i].nxt)
{
int v = e[i].to;
if (d[v] == d[s] + 1 && e[i].cap > 0LL)
{
LL df = dfs(v, t, min<LL>(f, e[i].cap));
if (df > 0LL)
{
e[i].cap -= df;
e[i ^ 1].cap += df;
ret += df;
f -= df;
if (!f)
break;
}
}
}
if (!ret)
d[s] = -1;
return ret;
}
LL dinic(int s, int t)
{
LL ret = 0LL;
while (bfs(s, t))
ret += dfs(s, t, INF);
return ret;
}
int main(void)
{
int n, m, a, b, i;
LL dx;
while (~scanf("%d%d", &n, &m))
{
init();
LL inf = dis[0];
for (i = 0; i < m; ++i)
{
scanf("%d%d%lld", &a, &b, &dx);
addE(a, b, dx); //Em
addE(b, a, dx); //Em
}
for (i = 1; i <= n; ++i)
scanf("%lld", &pos[i]); spfa(1);
pos[1] = pos[n] = inf;
for (int u = 1; u <= n; ++u)
{
adde(u, u + n, pos[u]); //en
for (int j = head[u]; ~j; j = E[j].nxt)
{
int v = E[j].to;
if (dis[v] - dis[u] == E[j].dx)
adde(u + n, v, inf); //em*2
}
}
printf("%lld\n", dinic(1, n << 1));
}
return 0;
}
BZOJ 3931 网络吞吐量(最短路+拆点最大流)的更多相关文章
- 网络流(最大流) CQOI 2015 BZOJ 3931 网络吞吐量
3931: [CQOI2015]网络吞吐量 Description 路由是指通过计算机网络把信息从源地址传输到目的地址的活 动,也是计算机网络设计中的重点和难点.网络中实现路由转发的硬件设备称为路由器 ...
- 【bzoj3931】[CQOI2015]网络吞吐量 最短路+最大流
题目描述 路由是指通过计算机网络把信息从源地址传输到目的地址的活动,也是计算机网络设计中的重点和难点.网络中实现路由转发的硬件设备称为路由器.为了使数据包最快的到达目的地,路由器需要选择最优的路径转发 ...
- BZOJ 3931: [CQOI2015]网络吞吐量( 最短路 + 最大流 )
最短路 + 最大流 , 没什么好说的... 因为long long WA 了两次.... ------------------------------------------------------- ...
- bzoj 3931: [CQOI2015]网络吞吐量 -- 最短路+网络流
3931: [CQOI2015]网络吞吐量 Time Limit: 10 Sec Memory Limit: 512 MB Description 路由是指通过计算机网络把信息从源地址传输到目的地址 ...
- 【BZOJ-3931】网络吞吐量 最短路 + 最大流
3931: [CQOI2015]网络吞吐量 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1228 Solved: 524[Submit][Stat ...
- [bzoj3931][CQOI2015]网络吞吐量——最短路+网络流
题目 传送门 题解 第一次一遍就AC一道bzoj上的题,虽然是一道水题... 我们做一边最短路,求出每个点的dist,然后再做一次类似spfa的操作,求出每个点是否可以用于建图. 在新图上拆点跑一边d ...
- BZOJ 3931: [CQOI2015]网络吞吐量
3931: [CQOI2015]网络吞吐量 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1555 Solved: 637[Submit][Stat ...
- BZOJ 3931: [CQOI2015]网络吞吐量 最大流
3931: [CQOI2015]网络吞吐量 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...
- 【BZOJ】【3931】【CQOI2015】网络吞吐量
最短路+最大流 思维难度并不高,其实题面几乎已经把算法讲完了…… 练习模板的好题= = 哦对了,求最短路和最大流的时候都得开long long……QwQ /********************** ...
随机推荐
- js调用后台,后台调用前台等方法总结
1. javaScript函数中执行C#代码中的函数:方法一:1.首先建立一个按钮,在后台将调用或处理的内容写入button_click中; 2.在前台写一个js函数,内容为docume ...
- github相关问题
一.项目编译打包后生成的dist文件夹后:项目提交到github上dist文件提交不上去. 在.gitignore文件,删除一行 二.更改github的语言属性 .gitattributes文件:若项 ...
- C#冒泡排序程序
考虑到很多面试可能会考察冒泡排序的用法,所以特地花时间厘清了一下思路.下面说一下我的思路:冒泡排序核心就是比较方法,冒泡排序的比较方法顾名思义就是像气泡一样,最大(或者最小)的数往上冒.普通比较几个数 ...
- 记录JQ-WEUI中滚动加载的一个BUG
最近写微信公众号,用到的技术栈是jq+vue的混合开发,采用的UI是移动端比较火的WEUI,在微信开发中应该较广泛.个人看惯了elementUI文档,相对于饿了么组件文档的详细,WEUI的文档还是比较 ...
- GVIM——简直美如画,有没有!
"========================================== " Author: wklken " Version: 9.1 " Em ...
- 3.Cisco Packet Tracer中关于交换机端口安全的设置
本次实验将在这幅拓扑图的基础上完成 我们会对pc0在交换机上进行mac地址绑定,pc1访问时则交换机断开端口 1.为pc机配置ip地址 pc0:192.168.1.1 pc1:192.168.1.2 ...
- ZOJ 3231 Apple Transportation 树DP
一.前言 红书上面推荐的题目,在138页,提到了关键部分的题解,但是实际上他没提到的还有若干不太好实现的地方.尤其是在这道题是大家都拿网络流玩弄的大背景下,这个代码打不出来就相当的揪心了..最后在牛客 ...
- Python登录人人网并抓取新鲜事
from sgmllib import SGMLParser import sys,urllib2,urllib,cookielib class spider(SGMLParser): def ...
- Contest - 中南大学第六届大学生程序设计竞赛(Semilive)
题1:1160十进制-十六进制 注意他给的数据范围 2^31,int是 2^31-1 #include<iostream> using namespace std; int main() ...
- UVa 1649 Binomial coefficients 数学
题意: \(C(n, k) = m(2 \leq m \leq 10^{15})\),给出\(m\)求所有可能的\(n\)和\(k\). 分析: 设\(minK = min(k, n - k)\),容 ...