[ BZOJ 3445 ] Roadblock
\(\\\)
\(Description\)
给出一张\(N\) 个点\(M\)条边的无向图,选择一条边使其权值翻倍,求操作后比操作前最短路长度增量最大值。
- \(1\le N\le 250\),\(1\le M\le 250000\)
\(\\\)
\(Solution\)
首先这么稠密的图SPFA肯定爆炸
- 注意到枚举哪条边权值翻倍再跑一遍最短路的做法复杂度是\(\Theta(M^2logN)\),显然会超时。
- 发现如果不使最短路上的边权翻倍最短路并不会发生变化,所以只需要考虑对原图最短路上的边操作即可。
- 确定最短路的边可以通过反向枚举,若发现\(dis[v]=dis[u]-e[i].w\)则找到了上一个点。
\(\\\)
\(Code\)
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 255
#define M 250010
#define R register
#define gc getchar
using namespace std;
bool vis[N];
int n,m,res,ans,tot=1,hd[N],dis[N];
struct edge{int to,nxt,w;}e[M<<1];
inline void add(int u,int v,int w){
e[++tot].w=w; e[tot].to=v;
e[tot].nxt=hd[u]; hd[u]=tot;
}
inline int rd(){
int x=0; bool f=0; char c=gc();
while(!isdigit(c)){if(c=='-')f=1;c=gc();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();}
return f?-x:x;
}
priority_queue<pair<int,int> > q;
inline void dij(){
memset(vis,0,sizeof(vis));
memset(dis,0x3f,sizeof(dis));
dis[1]=0; q.push(make_pair(0,1));
while(!q.empty()){
int u=q.top().second; q.pop();
if(vis[u])continue; vis[u]=1;
for(R int i=hd[u],v;i;i=e[i].nxt)
if(dis[v=e[i].to]>dis[u]+e[i].w){
dis[v]=dis[u]+e[i].w;
q.push(make_pair(-dis[v],v));
}
}
}
vector<int> s;
inline void find(){
int u=n;
while(u!=1){
for(R int i=hd[u],v;i;i=e[i].nxt)
if(dis[v=e[i].to]==dis[u]-e[i].w){
s.push_back(i); u=v; break;
}
}
}
int main(){
n=rd(); m=rd();
for(R int i=1,u,v,w;i<=m;++i){
u=rd(); v=rd(); w=rd();
add(u,v,w); add(v,u,w);
}
dij(); res=dis[n]; find();
for(R int i=0;i<(int)s.size();++i){
e[s[i]].w<<=1; e[s[i]^1].w<<=1;
dij(); ans=max(ans,dis[n]-res);
e[s[i]].w>>=1; e[s[i]^1].w>>=1;
}
printf("%d\n",ans);
return 0;
}
[ BZOJ 3445 ] Roadblock的更多相关文章
- 【BZOJ 3445】【Usaco2014 Feb】Roadblock
http://www.lydsy.com/JudgeOnline/problem.php?id=3445 加倍的边一定在最短路上(否则继续走最短路). 最短路长度是O(n)的,暴力扫最短路上的每条边, ...
- BZOJ 3445: [Usaco2014 Feb] Roadblock
Description 一个图, \(n\) 个点 \(m\) 条边,求将一条边距离翻倍后使 \(1-n\) 最短路径增加的最大增量. Sol Dijstra. 先跑一边最短路,然后枚举最短路,将路径 ...
- DAY 7 上午
一些图论的题目 BZOJ 3445 Roadblock 求出最短路,枚举每条边再跑一遍即可(科技为了我 代码: #include<bits/stdc++.h> using namespac ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- BZOJ 2127: happiness [最小割]
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1815 Solved: 878[Submit][Status][Di ...
- BZOJ 3275: Number
3275: Number Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 874 Solved: 371[Submit][Status][Discus ...
- BZOJ 2879: [Noi2012]美食节
2879: [Noi2012]美食节 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1834 Solved: 969[Submit][Status] ...
- bzoj 4610 Ceiling Functi
bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...
- BZOJ 题目整理
bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...
随机推荐
- nyoj 63 小猴子下落
小猴子下落 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 有一颗二叉树,最大深度为D,且所有叶子的深度都相同.所有结点从左到右从上到下的编号为1,2,3,····· ...
- Ubuntu 16.04安装Bless十六进制编辑器
一款专注于十六进制的编辑器. 安装: sudo apt-get install bless 启动:
- iOS消息推送原理和实现总结
一.消息推送原理: 在实现消息推送之前先提及几个于推送相关概念,如下图:1. Provider:就是为指定IOS设备应用程序提供Push的服务器,(如果IOS设备的应用程序是客户端的话,那么Provi ...
- ubuntu 图形界面搜索软件Catfish (鲶鱼)
Catfish(鲶鱼)是一款Linux桌面图形软件,可以在桌面图形化的搜索文件. 在Ubuntu下可以用 : sudo apt-get install catfish 安装
- [javase学习笔记]-7.7 thiskeyword的细节与应用
这一节我们接着上一节来继续学习thiskeyword. 我们之前在7.5节中的构造函数应注意的细节中提到过一个细节就是构造函数能够调用一般函数,但一般函数不能直接调用构造函数.可是我们没有深究构造函数 ...
- ASPNETCOREAPI 跨域处理 SQL 语句拼接 多条件分页查询 ASPNET CORE 核心 通过依赖注入(注入服务)
ASPNETCOREAPI 跨域处理 AspNetCoreApi 跨域处理 如果咱们有处理过MV5 跨域问题这个问题也不大. (1)为什么会出现跨域问题: 浏览器安全限制了前端脚本跨站点的访问资源, ...
- hdu 1728 逃离迷宫 bfs记步数
题链:http://acm.hdu.edu.cn/showproblem.php?pid=1728 逃离迷宫 Time Limit: 1000/1000 MS (Java/Others) Mem ...
- 树莓派玩耍笔记1 -- 开箱 & 安装系统以及简单配置
零.前言 树莓派是什么? 吃的么? 呵呵,假设您连这个还不知道,真是out 了. 麻烦出门左拐.百度去(或者,看看官网去?),算了.还是粘贴一些大家都知道的树莓派百科吧: 树莓派由注冊于英国的慈善组织 ...
- mac关闭和开启启动声
1 关闭 sudo nvram SystemAudioVolume=%01 2 开启 sudo nvram -d SystemAudioVolume
- Java之正則表達式【使用语法】
认为好就顶一个!! ! ! 3.正則表達式 用一些特殊的有意义的字符组成的字符串(死记) 原子:正則表達式的最基本组成单位 正則表達式特殊意义的字符: . * + ?不能单独表示它们,假设非 ...