当前位置:网站首页>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;
}
边栏推荐
- Use cheat engine to modify money, life and stars in Kingdom rush
- Gmapping code analysis [easy to understand]
- SIFT feature point extraction "suggestions collection"
- ORA-01455: converting column overflows integer datatype
- 消息队列消息丢失和消息重复发送的处理策略
- Thread application instance
- Reduce -- traverse element calculation. The specific calculation formula needs to be passed in and combined with BigDecimal
- 为什么要做企业固定资产管理系统,企业如何加强固定资产管理
- Web2.0 giants have deployed VC, and tiger Dao VC may become a shortcut to Web3
- Advanced performance test series "24. Execute SQL script through JDBC"
猜你喜欢

Web2.0 giants have deployed VC, and tiger Dao VC may become a shortcut to Web3

Thread application instance

Data dimensionality reduction factor analysis

Refactoring: improving the design of existing code (Part 1)

codeforces每日5题(均1700)-第四天

Juypter notebook modify the default open folder and default browser

Processing strategy of message queue message loss and repeated message sending

450-深信服面经1

Tutoriel (5.0) 10. Dépannage * fortiedr * fortinet Network Security expert NSE 5

juypter notebook 修改默认打开文件夹以及默认浏览器
随机推荐
虚拟机初始化脚本, 虚拟机相互免秘钥
Data dimensionality reduction factor analysis
450-深信服面经1
Which video recording software is better for the computer
全志A33使用主线U-Boot
451-memcpy、memmove、memset的实现
Develop fixed asset management system, what voice is used to develop fixed asset management system
守望先锋世界观架构 ——(一款好的游戏是怎么来的)
zabbix5客户端安装和配置
Emmet基础语法
聊聊电商系统中红包活动设计
452-strcpy、strcat、strcmp、strstr、strchr的实现
End to end object detection with transformers (Detr) paper reading and understanding
IEDA refactor的用法
Web2.0的巨头纷纷布局VC,Tiger DAO VC或成抵达Web3捷径
Digital scroll strip animation
Reduce -- traverse element calculation. The specific calculation formula needs to be passed in and combined with BigDecimal
Usage of ieda refactor
PHP asymmetric encryption method private key and public key encryption and decryption method
Notes de lecture sur le code propre