牛客1080D tokitsukaze and Event (双向最短路)
题目链接: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 (双向最短路)的更多相关文章
- 牛客网 牛客小白月赛2 H.武-最短路(Dijkstra)
H.武 链接:https://www.nowcoder.com/acm/contest/86/H 这个题写的有点想发脾气,自己的板子垃圾了,这个题要用优先队列优化版的迪杰斯特拉的板子才可以过,但是自己 ...
- 牛客练习赛33 E tokitsukaze and Similar String (字符串哈希hash)
链接:https://ac.nowcoder.com/acm/contest/308/E 来源:牛客网 tokitsukaze and Similar String 时间限制:C/C++ 2秒,其他语 ...
- 牛客练习赛33 D tokitsukaze and Inverse Number (树状数组求逆序对,结论)
链接:https://ac.nowcoder.com/acm/contest/308/D 来源:牛客网 tokitsukaze and Inverse Number 时间限制:C/C++ 1秒,其他语 ...
- 牛客练习赛33 C tokitsukaze and Number Game (结论+字符串处理)
链接:https://ac.nowcoder.com/acm/contest/308/C 来源:牛客网 tokitsukaze and Number Game 时间限制:C/C++ 1秒,其他语言2秒 ...
- 牛客练习赛33 B tokitsukaze and RPG (类埃筛)
链接:https://ac.nowcoder.com/acm/contest/308/B 来源:牛客网 tokitsukaze and RPG 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/ ...
- 牛客练习赛50 D tokitsukaze and Event (最短路,思维)
牛客练习赛50 D tokitsukaze and Event 链接:https://ac.nowcoder.com/acm/contest/1080/D来源:牛客网 时间限制:C/C++ 1秒,其他 ...
- tokitsukaze and Soldier 来源:牛客网
题目 链接:https://ac.nowcoder.com/acm/contest/28886/1004 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K, ...
- 牛客网Java刷题知识点之ArrayList 、LinkedList 、Vector 的底层实现和区别
不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...
- 牛客网Java刷题知识点之Java 集合框架的构成、集合框架中的迭代器Iterator、集合框架中的集合接口Collection(List和Set)、集合框架中的Map集合
不多说,直接上干货! 集合框架中包含了大量集合接口.这些接口的实现类和操作它们的算法. 集合容器因为内部的数据结构不同,有多种具体容器. 不断的向上抽取,就形成了集合框架. Map是一次添加一对元素. ...
随机推荐
- JS 获取验证码 倒计时
setInterval 一个定时器搞定 <style> button{ background: #45BCF9; color: #fff; padding: 4px 10px; borde ...
- Chrome浏览器控制台报Refused to get unsafe header "XXX"的错误
最近在调试后端下载的接口时在浏览器的控制台中发现了红色的错误信息,例如Refused to get unsafe header "XXX":前端是采用XMLHttpRequest对 ...
- burpsuite各个板块儿详细讲解
burpsuite实战指南,想要的都在这里:https://t0data.gitbooks.io/burpsuite/content/
- The file is absent or does not have execute permission This file is needed to run this program
tomcat下载后发现startup.sh文件启动不了 原因: 没有权限 解决方案:chmod 777 *.sh
- 酸菜鱼的 DP动态规划 刷题记录
BZOJ1026: [SCOI2009]windy数 数位dp.很多小细节... 代码: #include <bits/stdc++.h> using namespace std; typ ...
- 【转载】深入理解Java虚拟机笔记---运行时栈帧结构
栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区的虚拟机栈(Virtual Machine Stack)的栈元素.栈帧存储了方法的局部变量表,操作 ...
- mybatis一级缓存和二级缓存(一)
一级缓存: 就是Session级别的缓存.一个Session做了一个查询操作,它会把这个操作的结果放在一级缓存中. 如果短时间内这个session(一定要同一个session)又做了同一个操作,那么h ...
- phpstorm更换主题
打开PhpStorm,File -- Settings -- Editor -- Color Scheme --General选择你喜欢的风格进行更改,选择完成后单击Apply
- Python自定义任务发邮件提醒
前言 在工作中,有时会有一些定期需要执行的任务或在将来某一天需要执行的任务,为避免疏漏,设计个小工具,发邮件提醒自己去处理. 方案简介 1.建立一个Excel文件,里面定义好待提醒的任务 2.建立一个 ...
- 文本中自动出现的 ​
文本中自动出现的 ​ 所借鉴原页面地址:https://blog.csdn.net/judyc/article/details/53097142 因判断容器内字符长度来做其它处理 ...