题干:

链接:https://ac.nowcoder.com/acm/contest/1080/D
来源:牛客网

这天,tokitsukaze带着她的舰队去才归一儿海探索。这个海域有n个站点,深海舰队控制着这片海域的m条航线,这些航线连接着这n个点,第i条航线连接着ui,vi两个点。航线都是正确的,也就是说没有重复的航线,也没有任何一个点与自己相连。tokitsukaze的舰队经过第i条航线时,会受到来自深海舰队的ai点伤害。

tokitsukaze可以在某个休息站点将接下来的战斗切换至夜战模式,这样在她的舰队经过第i条航线时,受到的伤害就变为bi,不过一旦切换到夜战模式就不能再次切换回来,所以她必须考虑清楚在哪里切换。

现在有个限时活动。活动难度分为1,2,3,4,...n,在难度1下,tokitsukaze可以在任意站点切换到夜战模式,而在难度2下,不能在站点1切换到夜战模式,在难度3下,不能在站点1,2切换模式...以此类推,即在难度k下,tokitsukaze不能在站点1,2,3,4,5...k-1切换模式。同时,活动还要求在游戏结束时必须处于夜战模式。

现在tokitsukaze的舰队从s点出发,要前往深海大本营所在的t点。请你告诉她,在难度为1,2,3,4,5...n时,她的舰队结束游戏时受到的最小伤害。

输入描述:

第一行包括2个正整数n,m,(2≤n≤10^5,1≤m≤min(n*(n-1)/2,10^5))。
接下来m行,每行包括4个正整数u,v,a,b,(1≤u,v≤n,1≤a,b≤10^9)。
最后一行包括2个正整数s,t,(1≤s,t≤n)。

输出描述:

请你告诉tokitsukaze,在难度为1,2,3,4,5...n时,她的舰队处于夜战模式结束游戏受到的最小伤害。

示例1

输入

复制

4 3
1 4 1 30
1 2 1 10
1 3 20 1
2 3

输出

复制

2
11
21
33

说明

活动难度为1时,在编号为1的点切换模式,受到的最小伤害为2。
活动难度为2时,在编号为2的点切换模式,受到的最小伤害为11。
活动难度为3时,在编号为3的点切换模式,受到的最小伤害为21。
活动难度为4时,在编号为4的点切换模式,受到的最小伤害为33。

示例2

输入

复制

4 3
1 4 30 1
1 2 10 1
1 3 20 1
3 1

输出

复制

1
1
1
51

说明

活动难度为1时,在编号为3的点切换模式,受到的最小伤害为1。
活动难度为2时,在编号为3的点切换模式,受到的最小伤害为1。
活动难度为3时,在编号为3的点切换模式,受到的最小伤害为1。
活动难度为4时,在编号为4的点切换模式,受到的最小伤害为51。路线是3-1-4-1。因为必须处于夜战模式结束游戏,所以在到达1后还要拐去4去切换模式。

解题报告:
因为有点懒而且比较水所以直接改改官方题解。
s为起点,用边权a跑一遍最短路,记为disa​。
把边的方向反转,t为起点,用边权b跑一遍最短路,记为disb​。(但是这题是双向边所以并不用反转)
那么在节点 i 切换模式的最小伤害为​disai+disbi,再做一遍后缀min即可。

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define FF first
#define SS second
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
typedef pair<int,int> PII;
const int MAX = 2e5 + 5;
struct Edge {int v,ne;ll a,b;
} e[MAX];
struct Point {int u;ll c;Point(){}Point(int u,ll c):u(u),c(c){}bool operator<(const Point & b) const {return c > b.c;}
};
int tot,head[MAX];
void add(int u,int v,ll a,ll b) {e[++tot].v = v;e[tot].a = a;e[tot].b = b;e[tot].ne = head[u];head[u] = tot;
}
ll disa[MAX],disb[MAX];
bool vis[MAX];
void Dija(int st,int ed) {memset(disa,0x3f,sizeof disa);memset(vis,0,sizeof vis);priority_queue<Point> pq;pq.push(Point(st,0));
//  vis[st] = 1;disa[st] = 0;while(!pq.empty()) {Point cur = pq.top();pq.pop();if(vis[cur.u] == 1) continue;vis[cur.u] = 1;for(int i = head[cur.u]; ~i; i = e[i].ne) {int v = e[i].v;if(vis[v] || disa[v] <= disa[cur.u] + e[i].a) continue;disa[v] = disa[cur.u] + e[i].a;pq.push(Point(v,disa[v]));}}
}
void Dijb(int st,int ed) {memset(disb,0x3f,sizeof disb);memset(vis,0,sizeof vis);priority_queue<Point> pq;pq.push(Point(st,0));
//  vis[st] = 1;disb[st] = 0;while(!pq.empty()) {Point cur = pq.top();pq.pop();if(vis[cur.u] == 1) continue;vis[cur.u] = 1;for(int i = head[cur.u]; ~i; i = e[i].ne) {int v = e[i].v;if(vis[v] || disb[v] <= disb[cur.u] + e[i].b) continue;disb[v] = disb[cur.u] + e[i].b;pq.push(Point(v,disb[v]));}}
}
ll ans[MAX];
int main()
{int n,m,st,ed;memset(head,-1,sizeof head);cin>>n>>m;for(int a,b,c,d,i = 1; i<=m; i++) {scanf("%d%d%d%d",&a,&b,&c,&d);add(a,b,c,d);add(b,a,c,d);}scanf("%d%d",&st,&ed);Dija(st,ed);Dijb(ed,st);ans[n] = disa[n]+disb[n];for(int i = n-1; i>=1; i--) {ans[i] = min(ans[i+1],disa[i]+disb[i]);}for(int i = 1; i<=n; i++) printf("%lld\n",ans[i]);return 0 ;
}

【牛客 - 1080D】tokitsukaze and Event(最短路,思维)相关推荐

  1. 牛客练习赛20:D. 最短路2

    链接:https://www.nowcoder.com/acm/contest/128/D 来源:牛客网 题目描述 "夏天的风 正暖暖吹过 穿过头发穿过耳朵..."耳机里在哼着这首 ...

  2. 牛客竞赛36签到题A(思维)

    //第一题签到(第一次做牛客的诶) 链接:https://ac.nowcoder.com/acm/contest/328/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C+ ...

  3. 牛客 郊区春游 状压+最短路

    题目链接:郊区春游 思路:首先先用floyd求一下各个点之间的最短路,那么接下来就是找出一条最短路将R个点串起来.最简单的就是枚举每一种排列然后求最小值,那么时间复杂度就是15!,也就是1307674 ...

  4. 数论分块 ---- 2020牛客多校第7场H-Dividing[思维+数论分块]

    题目大意: 解题思路:很明显满足条件的点是n%k==0∣∣n%k==1n\%k==0||n\%k==1n%k==0∣∣n%k==1 1.因为nnn是从111开始的如果一直乘以k[n=n∗k]k[n=n ...

  5. 2021牛客多校3 - Black and white(思维+最小生成树)

    题目链接:点击查看 题目大意:给出一个 n∗mn*mn∗m 的矩阵,初始时都是白色,可以花费掉 cost[i][j]cost[i][j]cost[i][j] 将格子 (i,j)(i,j)(i,j) 染 ...

  6. 牛客 - 牛牛的滑动窗口(单调栈+思维+差分)

    题目链接:点击查看 题目分析:给出 nnn 个数,定义滑动窗口的贡献是其中最大值与最小值的乘积,现在问对于长度分别为 [1,n][1,n][1,n] 的滑动窗口,贡献之和分别是多少 题目分析:考虑暴力 ...

  7. 牛客 - 丁姐姐喜欢Fibonacci(找规律+思维)

    题目链接:点击查看 题目大意:给出一个正整数n,求第n项斐波那契数列的奇偶性 题目分析:这个题..看到1e15的数据范围,第一反应就是去敲一个矩阵快速幂的模板,但发现题目没有给取模范围,所以还用不了矩 ...

  8. 【牛客 - 185A】无序组数 (思维,数学,因子个数)

    题干: 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262144K 64bit IO Format: %lld 题目描述 给出一个二元组(A,B) 求出无序 ...

  9. 牛客第三场 F Popping Balloons —— 思维 + 搞题

    题目链接:点我啊╭(╯^╰)╮ 题目大意: 二维平面,nnn 个气球     要求水平方向射三枪,垂直射三枪     每一枪可以打穿一行或一列的所有气球     水平或垂直的相邻枪的距离为 rrr   ...

最新文章

  1. 植物根际微生物组也有昼夜节律
  2. Oracle-Soft Parse/Hard Parse/Soft Soft Parse解读
  3. 2020-12-7(字节,半字,字,双字总结)
  4. 1.4 Hive和数据库的比较
  5. anaconda镜像源配置_Anaconda使用技巧,如何修改国内镜像源?
  6. 汇编:分段函数的值的计算
  7. python3的socket_python3的socket使用
  8. access窗体主体居中
  9. 深度学习中的batch,iteration,epoch复习总结
  10. DMX协议和RDM协议
  11. 【大咖有约】58同城孙玄:58同城从MongoDB到MySQL迁移之路
  12. Linux开发环境——RHEL7更换yum源
  13. Matlab实现基于元胞自动机模拟室内人员疏散的最基本模型
  14. matlab control包,免费试用Instrument Control Toolbox
  15. SNF快速开发平台--规则引擎介绍和使用文档
  16. Win10重装后无法激活问题解决办法
  17. 人工智能照进三百六十行:百度大脑与劳动者们
  18. ORACLE违反协议异常
  19. 网上搜索电子书的办法
  20. 『曹大带我学 Go 』系列文章汇总

热门文章

  1. Codeforces Round #143 (Div. 2) C
  2. 推荐笔记本用户使用的硬盘。。。2.5”战胜台式机硬盘 日立7K320-250GB
  3. 动态规划——硬币找零思路
  4. 华为云服务器安装win10系统,云服务器可以安装win10吗
  5. python如何处理数据_python数据处理之如何选取csv文件中某几行的数据
  6. shell 进入hadoop_Hadoop Shell命令
  7. 五大算法之三--贪心算法
  8. WinCE内核裁减(中文字体)及字库和内核的分离
  9. PB编译错误:Mismatched time stamp on .rel file for module nk.exe requesting kernel fixup. Valid .rel file
  10. gin redis 链接不上_Redis 高并发问题,及解决方案!