单源最短路径
题目
输入
输出
输入样例
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
解题思路
我们这题要用 堆 优 化 堆优化 堆优化 + + + d i j k s t r a dijkstra dijkstra
程序如下
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
int n, m, s, u, v, w, k;
int dis[100001], head[100001], vis[100001], adj[100001];
priority_queue<pair<int , int> > q;
struct node
{
int to, next, val;
}e[1000001];
void add(int x, int y, int z)
{
e[++k] = (node){y, head[x], z};
head[x] = k;
}
void dij(int s)
{
memset(dis, 0x3f, sizeof(dis));
dis[s] = 0;
q.push(make_pair(0, s));
while(q.size())
{
int x = q.top().second;
q.pop();
if(vis[x]) continue;
vis[x] = true;
for(int i = head[x]; i; i = e[i].next)
{
int y = e[i].to, z = e[i].val;
if(dis[y] > dis[x] + z)
{
dis[y] = dis[x] + z;
q.push(make_pair(-dis[y], y));
}
}
}
}
int main()
{
scanf("%d%d%d",&n,&m,&s);
for(int i = 1; i <= m; ++i)
{
scanf("%d%d%d",&u,&v,&w);
add(u, v, w);
}
dij(s);
for(int i = 1; i <= n; ++i)
printf("%d ", dis[i]);
return 0;
}