题面:

传送门

思路:

真·动态最短路

但是因为每次只加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 ;
}

最新文章

  1. Ubuntu 14.04 下安装wiznote客户端
  2. 转 苹果企业级帐号进行ipa打包,分发,下载等流程
  3. Get the current user permission level on a list item with ecmascript 分类: Sharepoint 2015-07-14 14:13 7人阅读 评论(0) 收藏
  4. zookeeper学习(一)安装、配置、运行
  5. koala编译scss文件时不支持中文字体的解决方案
  6. iOS开发--隐藏(去除)导航栏底部横线
  7. cocoapods没有自动补齐
  8. oracle下的OVER(PARTITION BY)函数介绍
  9. postgresql创建用户
  10. [zz]npm安装错误解决方法
  11. gnome 3 美化
  12. Windows使用问题总结
  13. javascript正则表达式学习(二)--位置匹配
  14. 如何快速掌握DDT数据驱动测试?
  15. CentOS 7 安装MySQL5.7.25
  16. 蒙特卡洛树,AMAF,Rave浅析
  17. Cas 服务器 使用HTTP协议对外服务
  18. ACM-ICPC 2017 Asia Xi&#39;an A XOR (线性基+线段树思想)
  19. 前端之js
  20. Linux安装模式AppImage,Flatpak,Snap整理

热门文章

  1. 用virtualenv构建一个新的python环境,这个新的环境在这个创建的文件夹下
  2. Java 发送 Https 请求工具类 (兼容http)
  3. ThreadLocal为什么要用WeakReference
  4. 漫谈 Clustering (番外篇): Expectation Maximization
  5. js数据结构处理--------扁平化数组处理为树结构数据
  6. 在主机端和设备端进行”incrementArray“并对结果进行比较
  7. C#的接口基础教程之七 覆盖虚接口
  8. servlet从服务器磁盘文件读出到浏览器显示,中文乱码问题,不要忘记在输入流和输出流都要设置编码格式,否则一个地方没设置不统一就会各种乱码
  9. Vue源码学习二 ———— Vue原型对象包装
  10. 【转载】SQLServer中char、varchar、nchar、nvarchar的区别: