L2-001 緊急救援 (25分)【新增陣列求最短路數量】【pre陣列記錄最短路徑】
這道題,需要求出用vector來做,用陣列來做可能會爆。
dijkstra()就不說什麼,主要是關於新增兩個陣列:
- 第一:新增num[]陣列,
- 當兩個路徑的距離相等時,我們要用num[]陣列與之前的加和。
- 當兩個路徑的距離不同時,我們要更新num[]陣列。
- 第二:新增pre陣列,這個和迷宮問題是類似的,這裡主要說一下,pre[]陣列的輸出問題
- 1.可以用遞迴的方式輸出。
- 2.可以用while迴圈的方式輸出。
//遞迴輸出
void Path(int g)
{
if (g == s)
{
printf("%d", g);
return;
}
Path(pre[g]);
printf(" %d", g);
if(g == t)
puts("");
}
//while迴圈輸出
void Path()
{
int k = 0;
int x = t;
while(x != s)
{
a[k ++ ] = x;
x = pre[x];
}
reverse(a, a + k);
cout << '0' << ' ';
for(int i = 0; i < k; i ++ )
{
if(i != k - 1)
cout << a[i] << ' ';
else cout << a[i] << endl;
}
}
//這個最後會報錯,所以要改成vector來做。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4 + 10, M = N * 2;
int e[M], ne[M], idx, h[N], w[M];
int d1[N], d2[N];
int pre[N];
int n, m, s, t;
int cnt = 0;
int re[N], a[N], sum[N], num[N];
bool vis[N];
typedef pair<int, int> PII;
void add(int a, int b, int c)
{
e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx ++ ;
}
void dijkstra()
{
memset(d1, 0x3f, sizeof d1);
priority_queue<PII, vector<PII>, greater<PII> > q;
q.push({0, s});
d1[s] = 0;
while(q.size())
{
PII g = q.top();
q.pop();
if(vis[g.second]) continue;
vis[g.second] = true;
int ver = g.second, dist = g.first;
for(int i = h[ver]; ~i; i = ne[i])
{
int j = e[i];
if(d1[j] > dist + w[i])
{
d1[j] = dist + w[i];
num[j] = num[ver];
sum[j] = sum[ver] + re[j];
pre[j] = ver;
q.push({d1[j], j});
}
else if(d1[j] == dist + w[i])
{
num[j] += num[ver];
if(sum[j] < sum[ver] + re[j])
{
sum[j] = sum[ver] + re[j];
pre[j] = ver;
}
q.push({d1[j], j});
}
}
}
}
void Path()
{
int k = 0;
int x = t;
while(x != s)
{
a[k ++ ] = x;
x = pre[x];
}
reverse(a, a + k);
cout << '0' << ' ';
for(int i = 0; i < k; i ++ )
{
if(i != k - 1)
cout << a[i] << ' ';
else cout << a[i] << endl;
}
}
int main()
{
memset(h, -1, sizeof h);
cin >> n >> m >> s >> t;
for(int i = 0; i < n; i ++ ) cin >> re[i];
for(int i = 0; i < m; i ++ )
{
int a, b, c;
cin >> a >> b >> c;
add(a, b, c);
add(b, a, c);
}
memset(vis, 0, sizeof vis);
memset(pre, -1, sizeof pre);
num[s] = 1;
sum[s] = re[s];
dijkstra();
cout << num[t] << ' ' << sum[t] << endl;
Path();
return 0;
}
相關文章
- L2-001 緊急救援【最短路】
- 矩陣求最短路徑矩陣
- 最短路:求最長最短路
- 最短路 || 最長路 || 次短路
- JS陣列遍歷和獲取陣列最值JS陣列
- 構建最簡單陣列陣列
- 978 最長湍流子陣列陣列
- Leetcode 陣列中和為給定值的最長子陣列LeetCode陣列
- L2-001 緊急救援
- 陣列元素的數量陣列
- BFS求無權圖的單源最短路徑-鄰接矩陣儲存矩陣
- JavaScript如何求陣列的質數JavaScript陣列
- L2-001 緊急救援 (25分)
- 求二維陣列中最大子陣列的和陣列
- 記一次陣列操作:陣列 A 根據陣列 B 排序陣列排序
- PHP獲取陣列最後一個值PHP陣列
- JavaScript獲取陣列最後一個元素JavaScript陣列
- 845. 陣列中的最長山脈陣列
- 矩陣快速冪加速最短路矩陣
- 數字陣列最值,總和,平均,中位數 未完待續陣列
- 求陣列內所有偶數的和陣列
- Python數模筆記-NetworkX(2)最短路徑Python筆記
- L2-001 緊急救援 (25分)javaJava
- 求陣列平均值陣列
- lLeeCode最優題解收錄:1588.所有奇數長度子陣列的和陣列
- 陣列小記陣列
- JavaSE 陣列:一維陣列&二維陣列Java陣列
- leetcode 845. 陣列中的最長山脈 做題筆記LeetCode陣列筆記
- 無序陣列求第K大的數陣列
- 6.4.2最短路徑
- 圖 - 最短路徑
- 陣列演算法 往陣列尾部新增一條資料1202陣列演算法
- python實現給定一個數和陣列,求陣列中兩數之和為給定的數Python陣列
- 將字串陣列轉換為浮點數陣列字串陣列
- 陣列的方法-新增刪除陣列
- 最長公共子串 二維陣列 Go實現陣列Go
- 單源最短路徑:最短路徑性質的證明
- 求最短路徑——DFS+Floyd演算法演算法