牛客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是一次添加一对元素. ...
随机推荐
- AI机器人最高等级
AI机器人最高等级 题目描述 在小朱朱的游戏世界里,有n个AI机器人. 他们相互之间可以进行PK,胜方存活且升一级,负方直接淘汰. 高等级AI必定战胜低等级AI,同等级AI的PK结果必定一胜一负,且规 ...
- 0级搭建类005-Oracle Solaris Unix安装 (11.4) 公开
项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列目前不对外发布,仅作为博客记录.如学员在实际工作过程中需提前 ...
- BurpSuite 汉化版(含注册机)安装教程
1.注册机使用方法 首先需要完成java安装及环境变量配置. 打开burp-loader-keygen.jar(注册机)--点击run--license text (随意写)--然后将生成的lic ...
- redux基础概念及执行流程详解
一.执行流程 全局有一个公共的容器(所有组件都可以操作),我们可以在某个组件中把全局容器中的信息进行修改,而只要全局信息修改,就可以通知所有用到该信息的组件重新渲染(类似于发布订阅)==>red ...
- css 基础教程学习
css基础语法 css语法 CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明. 选择器通常是您需要改变样式的 HTML 元素. 每条声明由一个属性和一个值组成. 如果要定义不止一个声明,则 ...
- linux--介绍和指令练习
Linux Linux就是个操作系统:它和Windows XP.Windows7.8.10什么的一样就是一个操作系统而已! Linux能干什么:能当服务器,在服务器上安装者各种企业应用.服务. 比如: ...
- 多项式对数函数 - NTT
#include <bits/stdc++.h> using namespace std; #define int long long const int N=4000005; // 4 ...
- Wannafly Camp 2020 Day 6F 图与三角形 - 图论
把黑边视为无边,那么答案之和每个点的度数有关 #include <bits/stdc++.h> using namespace std; #define int long long int ...
- How to read a paper efficiently - by prof. Pete carr
DON'T DO THAT: read the article from the beginning to end; it's a waste of time! READ A PAPER IN TWO ...
- Yaf学习过程中遇到的问题小记
一.在多模块开发过程中,先写了后台模块,即一开始默认的Index Module,之后新增Frontend,Wap模块,想要直接把Frontend模块设置成默认模块,然而setDefaultModule ...