题目链接:https://ac.nowcoder.com/acm/contest/1080/D

首先建两个图,一个是权值为a的图,一个是权值为b的图。

从s起点以spfa算法跑权值为ai的最短路到t点,d1[ i ]数组就表示在权值为ai的图中,s点到i点的最短路。

再从t点为起点spfa算法跑权值为bi的最短路到s点,d2[ i ]数组表示在权值为bi的图中,t点到s点的最短路。

在节点i切换模式的最小伤害就是d1[ i ] + d2[ i ],倒着遍历取min即可。

AC代码:

#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<algorithm>
#include<cstring>
#define maxn 100005
#define inf 0x3f3f3f3f
using namespace std;
struct node{
vector<int> w;
vector<int> num;
}Ga[maxn],Gb[maxn];
long long int inq[maxn],inq2[maxn],d1[maxn],d2[maxn],ans[maxn];
void addedge(long long int u,long long int v,long long int a,long long int b){
Ga[u].num.push_back(v),Ga[u].w.push_back(a);
Ga[v].num.push_back(u),Ga[v].w.push_back(a);
Gb[v].num.push_back(u),Gb[v].w.push_back(b);
Gb[u].num.push_back(v),Gb[u].w.push_back(b);
}
void init(){
memset(d1,inf,sizeof(d1));
memset(d2,inf,sizeof(d2));
memset(inq,0,sizeof(inq));
memset(inq2,0,sizeof(inq2));
memset(ans,inf,sizeof(ans));
}//初始化
int main(){
int n,m,s,t;
scanf("%d%d",&n,&m);
for(int i = 0;i<m;i++){
long long int u,v,a,b;
scanf("%lld%lld%lld%lld",&u,&v,&a,&b);
addedge(u,v,a,b); //建两个图
}
init();
scanf("%d%d",&s,&t);
queue<int> q;
q.push(s);
inq[s] = 1,d1[s] = 0;
while(!q.empty()){
int now = q.front();
q.pop();
inq[now] = 0;
for(int i = 0;i<Ga[now].num.size();i++ ){
int vex = Ga[now].num[i];
if(d1[vex] > d1[now] + Ga[now].w[i] ){
d1[vex] = d1[now] + Ga[now].w[i];
if(inq[vex] == 1){
continue;
}
inq[vex] = 1;
q.push(vex);
}
}
}//第一遍spfa
queue<int> q2;
q2.push(t);
inq2[t] = 1,d2[t] = 0;
while(!q2.empty()){
int now = q2.front();
q2.pop();
inq2[now] = 0;
for(int i = 0;i<Gb[now].num.size();i++ ){
int vex = Gb[now].num[i];
if(d2[vex] > d2[now] + Gb[now].w[i]){
d2[vex] = d2[now] + Gb[now].w[i];
if(inq2[vex] == 1){
continue;
}
inq2[vex] = 1;
q2.push(vex);
}
}
}//第二遍spfa
for(int i = n;i>=0;i--){
ans[i] = min(ans[i+1],d1[i] + d2[i]);
}//倒着扫描 ans[i]就是在i点切换模式的最小伤害
for(int i = 1;i<=n;i++){
if(i == n){
printf("%lld",ans[i]);
return 0;
}
printf("%lld\n",ans[i]);
}
}

牛客1080D tokitsukaze and Event (双向最短路)的更多相关文章

  1. 牛客网 牛客小白月赛2 H.武-最短路(Dijkstra)

    H.武 链接:https://www.nowcoder.com/acm/contest/86/H 这个题写的有点想发脾气,自己的板子垃圾了,这个题要用优先队列优化版的迪杰斯特拉的板子才可以过,但是自己 ...

  2. 牛客练习赛33 E tokitsukaze and Similar String (字符串哈希hash)

    链接:https://ac.nowcoder.com/acm/contest/308/E 来源:牛客网 tokitsukaze and Similar String 时间限制:C/C++ 2秒,其他语 ...

  3. 牛客练习赛33 D tokitsukaze and Inverse Number (树状数组求逆序对,结论)

    链接:https://ac.nowcoder.com/acm/contest/308/D 来源:牛客网 tokitsukaze and Inverse Number 时间限制:C/C++ 1秒,其他语 ...

  4. 牛客练习赛33 C tokitsukaze and Number Game (结论+字符串处理)

    链接:https://ac.nowcoder.com/acm/contest/308/C 来源:牛客网 tokitsukaze and Number Game 时间限制:C/C++ 1秒,其他语言2秒 ...

  5. 牛客练习赛33 B tokitsukaze and RPG (类埃筛)

    链接:https://ac.nowcoder.com/acm/contest/308/B 来源:牛客网 tokitsukaze and RPG 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/ ...

  6. 牛客练习赛50 D tokitsukaze and Event (最短路,思维)

    牛客练习赛50 D tokitsukaze and Event 链接:https://ac.nowcoder.com/acm/contest/1080/D来源:牛客网 时间限制:C/C++ 1秒,其他 ...

  7. tokitsukaze and Soldier 来源:牛客网

    题目 链接:https://ac.nowcoder.com/acm/contest/28886/1004 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K, ...

  8. 牛客网Java刷题知识点之ArrayList 、LinkedList 、Vector 的底层实现和区别

    不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...

  9. 牛客网Java刷题知识点之Java 集合框架的构成、集合框架中的迭代器Iterator、集合框架中的集合接口Collection(List和Set)、集合框架中的Map集合

    不多说,直接上干货! 集合框架中包含了大量集合接口.这些接口的实现类和操作它们的算法. 集合容器因为内部的数据结构不同,有多种具体容器. 不断的向上抽取,就形成了集合框架. Map是一次添加一对元素. ...

随机推荐

  1. 深入浅出Mybatis系列三-配置详解之properties与environments(mybatis源码篇)

    注:本文转载自南轲梦 注:博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 上篇文章<深入浅出Mybatis系列(二)---配置简介(mybatis源码篇 ...

  2. php如何获取单选复选和选择框的值

    1.很久没有写基础的东西了复习一下(往往简单的东西才复杂) <body> 选择语句 <form action="demo.php" method="po ...

  3. jQuery---京东轮播图

    京东轮播图 有个计数的,点右边,计数增加,判断计数是否超过总的长度,超过设置计数为0,再设置当前的图片动画,兄弟的图片动画 左边点击同理,计数是--,判断计数是否等于-1,等于则reset计数为总长度 ...

  4. 洛谷P3381 MCMF【网络流】

    题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入格式 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向 ...

  5. eclipse新建web项目,并将其部署到tomcat

    参考链接:https://blog.csdn.net/smilehhq/article/details/78414672

  6. pandas 读取excel时,遇到数字变为科学计数法了, 怎么破?? 别慌 这样来处理

    # 指定字段以string 方式读取 df = pd.read_excel("./test.xlsx", converters={"id": str})

  7. 【转】idea远程调试

    适用于web服务,thrift服务 对于分布式系统的调试不知道大家有什么好的方法.对于我来说,在知道远程调试这个方法之前就是在代码中打各种log,然后重新部署,上线,调试,这样比较费时.今天咱们来了解 ...

  8. Python模块导入详解

    定义 模块:用来从逻辑上组织Python代码(变量.函数.类.逻辑)去实现一个功能.本质就是.py结尾的Python文件. 包:用来从逻辑上组织模块的(可以放一堆模块在目录下).本质就是一个目录(必须 ...

  9. python笔记20(面向对象课程二)

    今日内容 类成员 成员修饰符 内容回顾 & 补充 三大特性 封装 函数封装到类 数据封装到对象 * class Foo: def __init__(self,name,age): self.n ...

  10. Mac 上完美解决SVN问题及svn软件

    注:本文是转自https://blog.csdn.net/qq_40144558/article/details/80630466 svn对Mac的支持不算美好,几乎所有软件都很繁琐,我们作为开发其实 ...