cf 843 D Dynamic Shortest Path [最短路+bfs]
题面:
思路:
真·动态最短路
但是因为每次只加1
所以可以每一次修改操作的时候使用距离分层的bfs,在O(n)的时间内解决修改
这里要用到一个小技巧:
把每条边(u,v)的边权表示为dis[u]+w(u,v)-dis[v],这样边权实际上变成了“这条边离作为最短路的一份子还差了多少”
然后在用这个边权的新图里面更新1到每个点的最短路,再用原来的dis加上这个值,就是当前的最短路了
实际上是把绝对数值转化为了“离最优解的距离”,以此解题
Code:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define ll long long
#define inf 1e15
#define mp make_pair
using namespace std;
inline int read(){
int re=,flag=;char ch=getchar();
while(ch>''||ch<''){
if(ch=='-') flag=-;
ch=getchar();
}
while(ch>=''&&ch<='') re=(re<<)+(re<<)+ch-'',ch=getchar();
return re*flag;
}
int n,m,cnt,first[];ll dis[];
struct edge{
int to,next,w;
}a[];
inline void add(int u,int v,int w){
a[++cnt]=(edge){v,first[u],w};first[u]=cnt;
}
struct node{
int x;node(){x=;}
node(int xx){x=xx;}
bool operator <(node r) const {
return dis[x]>dis[r.x];
}
};
int delta[];
priority_queue<node>qq;
void spfa(){
int i,u,v;
for(i=;i<=n;i++) dis[i]=inf;
dis[]=;qq.push(node());
while(!qq.empty()){
u=qq.top().x;qq.pop();
for(i=first[u];~i;i=a[i].next){
v=a[i].to;
if(dis[v]>dis[u]+(ll)a[i].w){
dis[v]=dis[u]+(ll)a[i].w;
qq.push(node(v));
}
}
}
}
queue<int>q[];
void bfs(){
memset(delta,0x3f,sizeof(delta));
int i,j,u,v,w,maxn,head=,tail=;
q[].push();delta[]=maxn=;
for(i=;i<=maxn;i++){
while(!q[i].empty()){
u=q[i].front();q[i].pop();
if(i>delta[u]) continue;
for(j=first[u];~j;j=a[j].next){
v=a[j].to;w=a[j].w;
if(delta[v]>delta[u]+dis[u]+w-dis[v]){
delta[v]=delta[u]+dis[u]+w-dis[v];
if(delta[v]<=n){
q[delta[v]].push(v);maxn=max(maxn,delta[v]);
}
}
}
}
}
}
int main(){
// freopen("d.in","r",stdin);
memset(first,-,sizeof(first));
int i,j,t1,t2,t3,Q;
n=read();m=read();Q=read();
for(i=;i<=m;i++){
t1=read();t2=read();t3=read();
add(t1,t2,t3);
}
spfa();
for(i=;i<=Q;i++){
t1=read();
if(t1==) t2=read(),printf("%I64d\n",(dis[t2]>=inf)?-:dis[t2]);
else{
t2=read();
memset(delta,,sizeof(delta));
for(j=;j<=t2;j++) t3=read(),a[t3].w++;
bfs();
for(j=;j<=n;j++) dis[j]+=(ll)delta[j];
// cout<<endl;
}
}
// system("pause");
return ;
}
cf 843 D Dynamic Shortest Path [最短路+bfs]的更多相关文章
- [CF843D]Dynamic Shortest Path
[CF843D]Dynamic Shortest Path 题目大意: 给定一个带权有向图,包含\(n(n\le10^5)\)个点和\(m(m\le10^5)\)条边.共\(q(q\le2000)\) ...
- Dynamic Shortest Path CodeForces - 843D (动态最短路)
大意: n结点有向有权图, m个操作, 增加若干边的权重或询问源点为1的单源最短路. 本题一个特殊点在于每次只增加边权, 并且边权增加值很小, 询问量也很小. 我们可以用johnson的思想, 转化为 ...
- 【CF edu 27 G. Shortest Path Problem?】
time limit per test 3 seconds memory limit per test 512 megabytes input standard input output standa ...
- CF843D Dynamic Shortest Path spfa+剪枝
考试的T3,拿暴力+剪枝卡过去了. 没想到 CF 上也能过 ~ code: #include <bits/stdc++.h> #define N 100004 #define LL lon ...
- HDU 4725 The Shortest Path in Nya Graph (最短路)
The Shortest Path in Nya Graph Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- ZOJ 2760 - How Many Shortest Path - [spfa最短路][最大流建图]
人老了就比较懒,故意挑了到看起来很和蔼的题目做,然后套个spfa和dinic的模板WA了5发,人老了,可能不适合这种刺激的竞技运动了…… 题目链接:http://acm.zju.edu.cn/onli ...
- HDU4725:The Shortest Path in Nya Graph(最短路)
The Shortest Path in Nya Graph Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- HDU - 3631 Shortest Path(Floyd最短路)
Shortest Path Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %I64d & %I64u SubmitStat ...
- hdu 4725 The Shortest Path in Nya Graph (最短路+建图)
The Shortest Path in Nya Graph Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
随机推荐
- [论文理解]Focal Loss for Dense Object Detection(Retina Net)
Focal Loss for Dense Object Detection Intro 这又是一篇与何凯明大神有关的作品,文章主要解决了one-stage网络识别率普遍低于two-stage网络的问题 ...
- flex在众多手机浏览器上的兼容方案(亲测华为手机自带浏览器)
如果项目使用构建工具,可加autoprefixer来处理,[autoprefixer使用指南] 纯手写css兼容代码,需给每个使用的属性加上属性前缀 /*display: flex;写法*/ span ...
- vue中v-show和v-if的异同
一.官方解释: v-if 是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建. v-if 也是惰性的:如果在初始渲染时条件为假,则什么也不做——直到条件第一次 ...
- Linux学习记录(二)
1.远程连接工具的使用 实际开发中,Linux服务器都在其他的地方,我们要通过远程的方式去连接Linux并操作它,Linux远程的操作工具有很多,企业中常用的有Puttty.secureCRT.SSH ...
- Jquery 就是怎么取得一个select的当前值
<select id="cursel">: <option value="1">值1</option>: <optio ...
- k8s的secret基本概念及案例
secret相对于configMap,功能上是相似的但是secret是以其他编码方式去记录配置信息的,但是也可以被解读,只不过有技术门槛,不是那么容易就被解读.使用base64可以解码:echo ** ...
- webpack的配置处理
1.webpack对脚本的处理 1.Js用什么loader加载? 1>webpack 本身就支持js的加载, 2>通过babel-loader ES2015 加载js,再用 babel-p ...
- 10.VUE学习之使用lodash库减少watch对后台请求的压力
问题描述 使用watch监听库里word的值的变化,获取新值后,用oxios发送的ajax异步请求, 此时会多次发送请求,浪费服务器资料. 解决办法 使用lodash库里的_.debounce函数延缓 ...
- 日志收集系统Flume及其应用
Apache Flume概述 Flume 是 Cloudera 提供的一个高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统.Flume 支持定制各类数据发送方,用于收集各类型数据:同时,Fl ...
- BZOJ - 2744 朋友圈 (二分图上的最大团)
[题目大意] 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着.一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最大数目.两 ...