当前位置:网站首页>AcWing 383. 观光 题解(最短路)
AcWing 383. 观光 题解(最短路)
2022-07-02 18:27:00 【乔大先生】
AcWing 383. 观光
和找最短路方案类似,只不过多了一次次短路,需要考虑在什么情况下需要更新次短路状态,这里用二维数组表示很妙,值得学习
#include<bits/stdc++.h>
using namespace std;
const int N = 1010, M = 20010;
int cse;
int h[N], e[M], w[M], ne[M], idx;
int S, T, n, m;
int dist[N][2], cnt[N][2]; //第一维记录点,第二维记录是最短路还是次短路
bool st[N][2]; //第一维记录点,第二维记录是最短路还是次短路
struct Ver{
int id, type, dist;
bool operator> (const Ver &W) const{
return dist > W.dist;
}
};
void add(int a, int b, int c){
e[idx] = b;
w[idx] = c;
ne[idx] = h[a];
h[a] = idx ++ ;
}
int dijkstra(){
memset(st, 0, sizeof st);
memset(cnt, 0, sizeof cnt);
memset(dist, 0x3f, sizeof dist);
dist[S][0] = 0; //初始化距离值
cnt[S][0] = 1; //初始化方案数
priority_queue<Ver, vector<Ver>, greater<Ver>>heap; //大根堆
heap.push({
S, 0, 0}); //第一个点入堆
while(heap.size()){
Ver v = heap.top();
heap.pop();
int ver = v.id, type = v.type, d = v.dist, ct = cnt[ver][type];
if(st[ver][type]) continue;
st[ver][type] = true;
for(int i = h[ver]; ~i; i = ne[i]){
int j = e[i];
if(dist[j][0] > d + w[i]){
//先更新次短路的状态,直接继承最短路的状态
dist[j][1] = dist[j][0];
cnt[j][1] = cnt[j][0];
heap.push({
j, 1, dist[j][1]});
//更新最短路的状态
dist[j][0] = d + w[i];
cnt[j][0] = ct;
heap.push({
j, 0, dist[j][0]});
}
else if(dist[j][0] == d + w[i]){
cnt[j][0] += ct;
}
else if(dist[j][1] > d + w[i]){
//找到新的次短路
dist[j][1] = d + w[i];
cnt[j][1] = ct;
heap.push({
j, 1, dist[j][1]}); //找到新的点状态之后记得入队
}
else if(dist[j][1] == d + w[i]){
cnt[j][1] += ct;
}
}
}
int res = cnt[T][0];
if(dist[T][0] + 1 == dist[T][1]) res += cnt[T][1];
return res;
}
int main()
{
cin>>cse;
while(cse -- ){
cin>>n>>m;
memset(h, -1, sizeof h);
idx = 0;
while(m -- ){
int a, b, c;
cin>>a>>b>>c;
add(a, b, c);
}
cin>>S>>T;
cout<<dijkstra()<<endl;
}
return 0;
}
边栏推荐
猜你喜欢
[test development] software testing - concept
High frequency interview questions
Web2.0的巨头纷纷布局VC,Tiger DAO VC或成抵达Web3捷径
codeforces每日5题(均1700)-第四天
End to end object detection with transformers (Detr) paper reading and understanding
According to the atlas of data security products and services issued by the China Academy of information technology, meichuang technology has achieved full coverage of four major sectors
Yolov3 trains its own data set to generate train txt
Introduction to the paper | analysis and criticism of using the pre training language model as a knowledge base
消息队列消息丢失和消息重复发送的处理策略
论文导读 | 关于将预训练语言模型作为知识库的分析与批评
随机推荐
高级性能测试系列《24. 通过jdbc执行sql脚本》
Gmapping code analysis [easy to understand]
Tutorial (5.0) 10 Troubleshooting * fortiedr * Fortinet network security expert NSE 5
What is 9D movie like? (+ common sense of dimension space)
Hospital online inquiry source code hospital video inquiry source code hospital applet source code
4274. 后缀表达式-二叉表达式树
预处理和预处理宏
Web2.0 giants have deployed VC, and tiger Dao VC may become a shortcut to Web3
Novice must see, click two buttons to switch to different content
股票证券公司排名,有安全保障吗
电脑使用哪个录制视频软件比较好
ORA-01455: converting column overflows integer datatype
搭建哨兵模式reids、redis从节点脱离哨兵集群
Preprocessing and preprocessing macros
PHP parser badminton reservation applet development requires online system
Gamefi chain game system development (NFT chain game development function) NFT chain game system development (gamefi chain game development source code)
#gStore-weekly | gStore源码解析(四):安全机制之黑白名单配置解析
Binary operation
MySQL advanced (Advanced) SQL statement
Golang concurrent programming goroutine, channel, sync