输入输出样例
输入 :
4 6 1
1 2 2
2 3 2
2 4 1
1 3 5
3 4 3
1 4 4
输出:
0 2 4 3
题目分析:(还是一个单源路径问题)
1.这道题利用里vector建立邻接表。
2.运用优先队列重载运算符。
3.用的dijkstra算法的思想。
4.运用vis数组进行标记。
5.运用队列进行回溯。(STL应用的广泛)
#include <iostream>
#include<vector>
#include <queue>
using namespace std;
const int maxn = 100005;
const int INF = 1e9+8;
int dis[maxn];
bool vis[maxn];
int n, m, w;
struct node1 {
int v;
int s;
};
struct node2 {
int to;
int len;
};
bool operator<(node1 x, node1 y) {
return x.s > y.s;
}
vector<node2>mp[maxn];
priority_queue<node1>s;
void dijkstra() {
for (int i = 1; i <=n; i++) {
dis[i]= INF;
}
dis[w] = 0;
node1 p;
p.v= w;p.s= 0;
s.push(p);
while (!s.empty()) {
int top = s.top().v;
s.pop();
if (vis[top]) continue;
for (int i = 0; i < mp[top].size(); i++) {
int dv = mp[top][i].to;
int ds = mp[top][i].len;
if (dis[dv] > dis[top] + ds) {
dis[dv] = dis[top] + ds;
}
node1 temp;
temp.s=dis[dv];temp.v= dv;//一定要注意该点的的最短路径更新问题
s.push(temp);
}
vis[top] = 1;
}
}
int main()
{
int x, y, z;
cin >> n >> m >> w;
for (int i = 1; i <= m; i++) {
cin >> x >> y >> z;
node2 p;
p.to = y; p.len = z;
mp[x].push_back(p);
}
dijkstra();
for (int i = 1; i <= n; i++) {
cout << dis[i] << " ";
}
}
撒花!