[Dijkstra] 单源最短路 P3371

 

题目描述

如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度。

输入输出格式

输入格式:

 

 

 

第一行包含三个整数N、M、S,分别表示点的个数、有向边的个数、出发点的编号。

接下来M行每行包含三个整数Fi、Gi、Wi,分别表示第i条有向边的出发点、目标点和长度。

 

输出格式:

 

 

 

一行,包含N个用空格分隔的整数,其中第i个整数表示从点S出发到点i的最短路径长度(若S=i则最短路径长度为0,若从点S无法到达点i,则最短路径长度为2147483647)

 

输入输出样例

输入样例#1: 复制

4 6 1
1 2 2
2 3 2
2 4 1
1 3 5
3 4 3
1 4 4

输出样例#1: 复制

0 2 4 3

说明

时空限制:1000ms,128M

数据规模:

对于20%的数据:N<=5,M<=15

对于40%的数据:N<=100,M<=10000

对于70%的数据:N<=1000,M<=100000

对于100%的数据:N<=10000,M<=500000

样例说明:

《[Dijkstra] 单源最短路 P3371》

图片1到3和1到4的文字位置调换

 

 

 

 

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int inf = 2e9;
const int mn = 2e5 + 10;

int cnt;
int to[mn], val[mn], nx[mn], fr[mn];
void addedge(int u, int v, int w)
{
	to[cnt] = v;
	val[cnt] = w;
	nx[cnt] = fr[u];
	fr[u] = cnt++;
}
struct node
{
	int id, len;
};
int n, m, s;
int d[mn];
bool vis[mn];
priority_queue<node> que;
bool operator <(const node& a, const node& b)
{
	return a.len > b.len;
}
void dijkstra()
{
	for (int i = 1; i <= n; i++)
		d[i] = inf;
	d[1] = 0;
	
	node t;
	t.id = 1, t.len = 0;
	que.push(t);
	while (!que.empty())
	{
		node now = que.top();
		que.pop();
		int a = now.id, b = now.len;
		if (vis[a])
			continue;
		vis[a] = 1;
		for (int i = fr[a]; i != -1; i = nx[i])
		{
			if (d[to[i]] > b + val[i])
			{
				d[to[i]] = b + val[i];
				node nod;
				nod.id = to[i];
				nod.len = d[to[i]];
				que.push(nod);
			}
		}
	}
}

int main()
{
	memset(fr, -1, sizeof fr);
	
    scanf("%d %d %d", &n, &m, &s);
    for (int i = 1; i <= m; i++)
	{
		int u, v, w;
		scanf("%d %d %d", &u, &v, &w);
		addedge(u, v, w);
	}
	dijkstra();
	
	for (int i = 1; i < n; i++)
		cout << d[i] << ' ';
	cout << d[n] << endl;
	
    return 0;
}

 

    原文作者:Dijkstra算法
    原文地址: https://blog.csdn.net/ummmmm/article/details/80632309
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞