牛客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是一次添加一对元素. ...
随机推荐
- kindle怎么导入电子书
参考网址:https://jingyan.baidu.com/article/59a015e342a165f795886545.html
- Python标准库之re模块
re模块用于正则表达式. 正则表达式在线测试:http://c.runoob.com/front-end/854 正则表达式元字符可以参考:https://www.w3cschool.cn/zheng ...
- Dubbo-服务注册中心之AbstractRegistry
在dubbo中,关于注册中心Registry的有关实现封装在了dubbo-registry模块中.提供者(Provider)个消费者(Consumer)都是通过注册中心进行资源的调度.当服务启动时,p ...
- redis中获取没有设置ttl过期时间的key
需求:redis作为一个内存型的数据库,我们需要对过期key保持关注,从info keyspace中可以看出有多少key没有设置过期时间,那么到底是哪些呢? 说明:关于redis ttl 的返回值,请 ...
- Linux的VMware虚拟机无法上网问题
很多时候,Linux无法上网,不管改成nat模式还是主机模式都不行.这时候可以选择进行重置: 首先点击编辑,之后点击虚拟网络编辑器, 然后移除VMnet0和VMnet8网络,点击确定: 然后再打开虚拟 ...
- springboot项目集成activity
1.按照上一篇博客,新建好springboot项目后,在项目pom.xml文件中添加activity依赖 <dependency> <groupId>org.activiti& ...
- mysql中获取本月第一天、本月最后一天、上月第一天、上月最后一天等等
转自: https://blog.csdn.net/min996358312/article/details/61420462 1.当函数使用时,即interval(),为比较函数,如:interva ...
- Spring5源码阅读环境搭建-gradle构建编译
前沿:Spring系列生态十分丰富,涉及到各个方面.但是作为Spring生态的核心基础Spring,是最重要的环节,需要理解Spring的设计原理,我们需要解读源码. 在构建Spring源码阅 ...
- 2020牛客寒假算法基础集训营5 G.街机争霸 (bfs)
https://ac.nowcoder.com/acm/problem/201961 预处理出僵尸走的路径,僵尸走的周期长度应该为2k-2,在普通的bfs基础上加上一维表示时间,从当前位置x,y和和时 ...
- Mysql备份参数
--all-databases , -A 导出全部数据库. mysqldump -uroot -p --all-databases --all-tablespaces , -Y 导出全部表空间. my ...