洛谷 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\) ...
随机推荐
- Mysql行转列的简单应用
最近在复习过程中愈发觉得,有些东西久了不用,真的会忘~——~. 将上面的表格转换为下面的表格 我拼sql拼了好久还是没弄出来,还是偶然看到我以前的笔记,才想起有行转列这样的操作(太久没有写过复杂点的s ...
- java基础---类加载和对象创建过程
类中可以存在的成员: class A{ 静态成员变量: 非静态成员变量: 静态函数: 非静态函数: 构造函数 A(..){...} 静态代码块 static{...} 构造代码块 {...} } 类加 ...
- WEB渗透测试基础工具
代理查询网站:hidemyass(隐藏我的屁股) HTTrack:HTTrack是一个免费和易用的离线浏览工具(浏览器),它可以允许你下载整个WWW网站至本地目录,并且通过遍历网站目录获取HTML,图 ...
- windows c++如何使窗口动态改变位置
在windows软件中,经常会碰到一个功能:鼠标hover在某个地方时会出现窗口,有时候这个窗口的位置是会动态调整的. 熟悉使用windows API,理解windows中虚拟坐标.工作区坐标.屏幕坐 ...
- AI入门课程资源
企业 kaggle https://www.kaggle.com/learn/overview Google 介绍 https://developers.google.cn/machine-lea ...
- PHP性能分析工具xdebug+qcachegrind
先安装xdebug工具 pecl install xdebug 修改php.ini配置 [xdebug] zend_extension="xdebug.so" # profiler ...
- zip命令详解
基础命令学习目录首页 好文链接:https://www.cnblogs.com/yinzhengjie/p/6247833.html 原文链接:https://www.cnblogs.com/ferr ...
- jenkins展示report测试报告的配置
HTML报告展示 1. 需要HTML Publisher plugin插件 2. 在workspace下的工程(构建)中的目录中存储测试报告 在Jenkins中新建一个job,进入配置项. 首先通过p ...
- (第六周)课上Scrum站立会议演示
组名:连连看 组长:张政 组员:张金生.李权.武志远 时间:2016.10.13 20:20——20:40 会议内容: 已完成的内容: 1.选定编译语言,安装软件并配置环境,完成了游戏的基本模型. ...
- Daily Scrumming* 2015.10.25(Day 6)
一.总体情况总结 1.UI今日总结:初步设计了社团详情界面 2.后端今日总结:讨论并设计数据库,表内容,属性和相互联系等,并在rails的activeRecord和activeModel中实现,同时设 ...