洛谷 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\) ...
随机推荐
- PHP核心技术——接口
接口: 接口这样描述自己:对于实现我的所有类,看起来都应该像我现在这个样子 接口含义:采用一个特定接口的所有代码都知道对于那个接口会调用什么方法. interface mobile{ public f ...
- kubeadm 线上集群部署(二) K8S Master集群安装以及工作节点的部署
PS:所有机器主机名请提前设置好 在上一篇,ETCD集群我们已经搭建成功了,下面我们需要搭建master相关组件,apiverser需要与etcd通信并操作 1.配置证书 将etcd证书上传到mast ...
- 转载:GBDT算法梳理
学习内容: 前向分布算法 负梯度拟合 损失函数 回归 二分类,多分类 正则化 优缺点 sklearn参数 应用场景 转自:https://zhuanlan.zhihu.com/p/58105824 G ...
- HTML常用头部变量
简例:访问baidu的头部 GET /?tn=98827400_hao_pg HTTP/1.1 Host: www.baidu.com Connection: keep-alive Cache-Con ...
- CocoaPods pod install的时候报错:invalid byte sequence in UTF-8 (ArgumentError)解决办法
CocoaPods pod install的时候报错:invalid byte sequence in UTF-8 (ArgumentError)解决办法: 基本可以确定是Podfile中的内容编码有 ...
- js备忘录2
JavaScript 的类型分为两类,分别是原始类型和对象类型 其中原始类型中只有数字.字符串和布尔型,和java中的有些不一样 null和undefined不是基本数据类型中的某一种 对象是prop ...
- connect by prior id= pid start with id='1' 树结构查询
基础表创建: with temp as ( ' id, '' pid from dual union all ' pid from dual union all ' pid from dual uni ...
- 在数组中找出两数之和为10的所有组合(JAVA)
/*利用冒泡排序实现*/ import java.util.Scanner;public class Paixun { public static void main(String[] args) { ...
- Alpha阶段综合报告
1.版本测试报告 1.1在测试过程中总共发现了多少Bug?每个类别的Bug分别为多少个? Bug分类 Bug内容 Fixed 编辑博文时改变文字格式会刷新界面 Can’t reproduced 无 N ...
- 浅学JavaScript
JavaScript是互联网上最流行的脚本语言,可广泛用于服务器.PC.笔记本电脑智能手机等设备: 对事件的反应: <!DOCTYPE html> <html> <hea ...