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]网络吞吐量 解题报告的更多相关文章

  1. 洛谷 P2604 [ZJOI2010]网络扩容 解题报告

    P2604 [ZJOI2010]网络扩容 题目描述 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用.求: 1. 在不扩容的情况下,1到N的最大流: 2. ...

  2. 洛谷 P3168 [CQOI2015]任务查询系统 解题报告

    P3168 [CQOI2015]任务查询系统 题目描述 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分. 超级计算机中的任务用三元组\((S_i,E_i,P_i) ...

  3. 洛谷_Cx的故事_解题报告_第四题70

    1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h>   struct node {     long x,y,c; ...

  4. 洛谷 P2317 [HNOI2005]星际贸易 解题报告

    P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...

  5. 洛谷 P3802 小魔女帕琪 解题报告

    P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...

  6. 洛谷 P2606 [ZJOI2010]排列计数 解题报告

    P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...

  7. 洛谷1303 A*B Problem 解题报告

    洛谷1303 A*B Problem 本题地址:http://www.luogu.org/problem/show?pid=1303 题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式 ...

  8. 洛谷 P2765 魔术球问题 解题报告

    P2765 魔术球问题 题目描述 问题描述: 假设有\(n\)根柱子,现要按下述规则在这\(n\)根柱子中依次放入编号为\(1,2,3,\dots\)的球. \((1)\) 每次只能在某根柱子的最上面 ...

  9. 洛谷 P3084 [USACO13OPEN]照片Photo 解题报告

    [USACO13OPEN]照片Photo 题目描述 农夫约翰决定给站在一条线上的\(N(1 \le N \le 200,000)\)头奶牛制作一张全家福照片,\(N\)头奶牛编号\(1\)到\(N\) ...

随机推荐

  1. Sqlmap常用命令大全

    1 Options(选项) -h,--help 显示帮助消息-hh 显示详细帮助-version -v VERBOSE 详细级别 0-6 默认12 Target 目标-u URL--url=URL-g ...

  2. 笨办法学Python - 习题3: Numbers and Math

    目录 习题 3: 数字和数学计算 算术运算符 加分习题: 我的答案: 总结: 扩展: Python比较运算符 Python赋值运算符 Python位运算符 Python逻辑运算符 Python成员运算 ...

  3. PHP性能分析工具xdebug+qcachegrind

    先安装xdebug工具 pecl install xdebug 修改php.ini配置 [xdebug] zend_extension="xdebug.so" # profiler ...

  4. Java时间格式的使用,bug难时真是坑

    很简单的问题,尤其是新手开发,要多自己动手写代码,都说程序猿大都是程序的搬用工,其实不然,好的写手,和差的写手,区别就在是不是会花时间读读代码,并且自己动手实践一下,其实一个程序范这样的错误,绝对是低 ...

  5. VS code MacOS 环境搭建

    环境:MacBook Pro 参考博客 为了动手开发AI代码,我需要安装一个VS code. 开始我以为是安装visual studio呢.我装过visual studio2017. VS code是 ...

  6. [BUAA软工]第零次博客作业---问题回答

    [BUAA软工]第0次博客作业 项目 内容 这个作业属于哪个课程 北航软工 这个作业的要求在哪里 第0次个人作业 我在这个课程的目标是 学习如何以团队的形式开发软件,提升个人软件开发能力 这个作业在哪 ...

  7. 20172324《Java程序设计》第二周学习总结

    20172324<Java程序设计>第2周学习总结 教材学习内容总结 了解了字符串及其拼接和转义序列的使用. Java的基本数据类型. 定义数据转换类型和实现其转换的方法. Scanner ...

  8. 微服务架构之思维三部曲:What、Why、How

    本文转自:http://www.servicemesh.cn/?/article/49 What:什么是微服务? 某百科对微服务架构的定义和阐述:微服务可以在“自己的程序”中运行,并通过“轻量级设备与 ...

  9. express和数据库(MySQL)的交互(二)

    一.安装express前面都讲了 1.express. cnpm || npm install express --save 2.中间件 a.cnpm || npm install body-pars ...

  10. vue-Slot分发内容

    ①概述: 简单来说,假如父组件需要在子组件内放一些DOM,那么这些DOM是显示.不显示.在哪个地方显示.如何显示,就是slot分发负责的活. ②默认情况下 父组件在子组件内套的内容,是不显示的. 例如 ...