洛谷 P3171 [CQOI2015]网络吞吐量 解题报告
P3171 [CQOI2015]网络吞吐量
题目描述
路由是指通过计算机网络把信息从源地址传输到目的地址的活动,也是计算机网络设计中的重点和难点。网络中实现路由转发的硬件设备称为路由器。为了使数据包最快的到达目的地,路由器需要选择最优的路径转发数据包。例如在常用的路由算法OSPF(开放式最短路径优先)中,路由器会使用经典的Dijkstra算法计算最短路径,然后尽量沿最短路径转发数据包。现在,若已知一个计算机网络中各路由器间的连接情况,以及各个路由器的最大吞吐量(即每秒能转发的数据包数量),假设所有数据包一定沿最短路径转发,试计算从路由器1到路由器n的网络的最大吞吐量。计算中忽略转发及传输的时间开销,不考虑链路的带宽限制,即认为数据包可以瞬间通过网络。路由器1到路由器n作为起点和终点,自身的吞吐量不用考虑,网络上也不存在将1和n直接相连的链路。
输入输出格式
输入格式:
输入文件第一行包含两个空格分开的正整数n和m,分别表示路由器数量和链路的数量。网络中的路由器使用1到n编号。接下来m行,每行包含三个空格分开的正整数a、b和d,表示从路由器a到路由器b存在一条距离为d的双向链路。 接下来n行,每行包含一个正整数c,分别给出每一个路由器的吞吐量。
输出格式:
输出一个整数,为题目所求吞吐量。
说明
对于100%的数据,n<=500,m<=100000,d,c<=10^9
get到题意是第一步,最短路径其实只需要1-n的就可以了。
我们先正反做一编最短路,把所有在最短路上的边抽出来建新图。
把每个点拆开,边权为点的吞吐量,其余边只是保证联通性,故置inf即可
Code:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
#define ll long long
using namespace std;
#define P pair <ll ,int >
const int N=502;
const int M=200010;
const ll inf=0x3f3f3f3f3f3f3f3f;
int n,m,used[N];
ll diss[N],dist[N],inout[N],edge0[M],edge[M<<1];
int head0[N],to0[M],Next0[M],cnt0;
void add0(int u,int v,ll w)
{
to0[++cnt0]=v;Next0[cnt0]=head0[u];edge0[cnt0]=w;head0[u]=cnt0;
}
int head[N<<1],to[M<<1],Next[M<<1],cnt=1;
void add(int u,int v,ll w)
{
to[++cnt]=v;Next[cnt]=head[u];edge[cnt]=w;head[u]=cnt;
}
priority_queue <P,vector<P >,greater<P > > q0;
P p;
void disj()
{
memset(diss,0x3f,sizeof(diss));
memset(used,0,sizeof(used));
diss[1]=0;
p.first=0,p.second=1;
q0.push(p);
while(!q0.empty())
{
int u=q0.top().second;
q0.pop();
if(used[u]) continue;
used[u]=1;
for(int i=head0[u];i;i=Next0[i])
{
int v=to0[i];
ll w=edge0[i];
if(diss[v]>diss[u]+w)
{
diss[v]=diss[u]+w;
p.first=diss[v],p.second=v;
q0.push(p);
}
}
}
memset(dist,0x3f,sizeof(diss));
memset(used,0,sizeof(used));
dist[n]=0;
p.first=0,p.second=n;
q0.push(p);
while(!q0.empty())
{
int u=q0.top().second;
q0.pop();
if(used[u]) continue;
used[u]=1;
for(int i=head0[u];i;i=Next0[i])
{
int v=to0[i];
ll w=edge0[i];
if(dist[v]>dist[u]+w)
{
dist[v]=dist[u]+w;
p.first=dist[v],p.second=v;
q0.push(p);
}
}
}
}
void New()
{
for(int i=1;i<=n;i++)
{
add(i,i+n,inout[i]);
add(i+n,i,0);
for(int j=head0[i];j;j=Next0[j])
{
int v=to0[j];
ll w=edge0[j];
if(diss[i]+dist[v]+w==diss[n])
{
add(i+n,v,inf);
add(v,i+n,0);
//printf("%d %d %lld\n",i,v,inout[v]);
}
}
}
}
void init()
{
scanf("%d%d",&n,&m);
int u,v;ll w;
for(int i=1;i<=m;i++)
{
scanf("%d%d%lld",&u,&v,&w);
add0(u,v,w),add0(v,u,w);
}
for(int i=1;i<=n;i++)
scanf("%lld",inout+i);
inout[1]=inf;
inout[n]=inf;
disj();
New();
}
int dep[N<<1];
queue <int > q;
bool bfs()
{
memset(dep,0,sizeof(dep));
dep[1]=1;
while(!q.empty()) q.pop();
q.push(1);
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=head[u];i;i=Next[i])
{
int v=to[i];
ll w=edge[i];
if(w&&!dep[v])
{
dep[v]=dep[u]+1;
if(v==n*2) return 1;
q.push(v);
}
}
}
return 0;
}
ll dfs(int now,ll flow)
{
if(now==n*2) return flow;
ll k,rest=flow;
for(int i=head[now];i&&rest;i=Next[i])
{
int v=to[i];
if(edge[i]&&dep[v]==dep[now]+1)
{
k=dfs(v,min(rest,edge[i]));
if(!k) dep[v]=0;
edge[i]-=k;
edge[i^1]+=k;
rest-=k;
}
}
return flow-rest;
}
void work()
{
ll flow=0,maxflow=0;
while(bfs())
while(flow=dfs(1,inf))
maxflow+=flow;
printf("%lld\n",maxflow);
}
int main()
{
init();
work();
return 0;
}
2018.7.7
洛谷 P3171 [CQOI2015]网络吞吐量 解题报告的更多相关文章
- 洛谷 P2604 [ZJOI2010]网络扩容 解题报告
P2604 [ZJOI2010]网络扩容 题目描述 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用.求: 1. 在不扩容的情况下,1到N的最大流: 2. ...
- 洛谷 P3168 [CQOI2015]任务查询系统 解题报告
P3168 [CQOI2015]任务查询系统 题目描述 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分. 超级计算机中的任务用三元组\((S_i,E_i,P_i) ...
- 洛谷_Cx的故事_解题报告_第四题70
1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h> struct node { long x,y,c; ...
- 洛谷 P2317 [HNOI2005]星际贸易 解题报告
P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...
- 洛谷 P3802 小魔女帕琪 解题报告
P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...
- 洛谷 P2606 [ZJOI2010]排列计数 解题报告
P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...
- 洛谷1303 A*B Problem 解题报告
洛谷1303 A*B Problem 本题地址:http://www.luogu.org/problem/show?pid=1303 题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式 ...
- 洛谷 P2765 魔术球问题 解题报告
P2765 魔术球问题 题目描述 问题描述: 假设有\(n\)根柱子,现要按下述规则在这\(n\)根柱子中依次放入编号为\(1,2,3,\dots\)的球. \((1)\) 每次只能在某根柱子的最上面 ...
- 洛谷 P3084 [USACO13OPEN]照片Photo 解题报告
[USACO13OPEN]照片Photo 题目描述 农夫约翰决定给站在一条线上的\(N(1 \le N \le 200,000)\)头奶牛制作一张全家福照片,\(N\)头奶牛编号\(1\)到\(N\) ...
随机推荐
- 提高JetBrains软件的性能
在Java开发中,我用的开发工具是Idea,它是JetBrains公司旗下的产品. 电脑内存较大,但是Idea加载的慢,我们可以通过 \bin 下的 idea64.exe.vmoptions 和 id ...
- 简介make命令和makefile文件
一.为什么要用到 make 命令和 makefile 文件 在 Linux 下编写一个程序,每次编译都需要在命令行一行一行的敲命令.如果是一个很小的程序还好说,命令不怎的复杂,编译速度也挺快,但是对于 ...
- <React Native移动开发实战>-1-React Native的JSX解决方案
JSX并不是一门新的开发语言,而是Facebook提出的语法方案:一种可以在JavaScript代码中直接书写HTML标签的语法糖,所以,JSX本质上还是JavaScript语言. 小知识:语法糖(S ...
- Redux和React-Redux的实现(二):Provider组件和connect的实现
接着上一篇讲,上一篇我们实现了自己的Redux和介绍了React的context以及Provider的原理. 1. Provider组件的实现 Provider组件主要有以下下两个作用 在整个应用上包 ...
- js循环复制一个div
<html> <head> <title>Test of cloneNode Method</title> <script type=" ...
- Python写一个根据日期计算是星期几的模块
import datetimedef get_week_day(date): week_day = { 0: '星期一', 1: '星期二', 2: '星期三', 3: '星期四', 4: '星期五' ...
- “吃神么,买神么”的第三个Sprint冲刺总结
第三阶段Spring的目标以及完成情况: 时间:6.16——6.26(10天) 目标:第三阶段主要是前台设计的修改完善,以及数据库成功连接,完成小部分功能 情况:前台界面完善,完成小部分功能(发布功能 ...
- BETA-3
前言 我们居然又冲刺了·三 团队代码管理github 站立会议 队名:PMS 530雨勤(组长) 过去两天完成了哪些任务 一堆deadline截至前的两天,为了图形学和编译原理毅然决然地放弃冲刺 接下 ...
- Scala入门系列(二):条件控制与循环
条件控制与循环 if表达式 定义:if表达式是有值的,就是if或者else中最后一行语句返回的值. 例如:val isAdult = if (age > 18) 1 else 0 类型推断: ...
- 怎样实现SDO服务
SDO是CANopen协议中最复杂的一部分,带有应答机制,有多种传输方式,并且完整的SDO功能节点需提供1个SDO server和多个SDO client,因此SDO的实现异常困难,协议多种传输方式的 ...