-
- 282通过
- 1.1K提交
- 题目提供者HansBug
- 标签
- 难度普及/提高-
讨论 题解
最新讨论
- 不萌也是新,老司机求带
- 求看,spfa跑模板40分
- 为什么orz了
- 题目输入格式的描述是错的
- 题目描述是有问题的
- 关于题目的疑惑
题目描述
如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度。
输入输出格式
输入格式:第一行包含三个整数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
样例说明:
#include <cstdio> #include <cstring> #include <queue> #include <iostream> #include <algorithm> using namespace std; int n, m, s,tot,head[10010],nextt[500010],to[500010],w[500010],vis[10010],d[10010]; void spfa(int x) { queue <int> q; q.push(x); vis[x] = 1; d[x] = 0; while (!q.empty()) { int u = q.front(); q.pop(); vis[u] = 0; for (int i = head[u];i; i = nextt[i]) { int v = to[i]; if (d[u] + w[i] < d[v]) { d[v] = d[u] + w[i]; if (!vis[v]) { vis[v] = 1; q.push(v); } } } } } void add(int a,int b,int c) { tot++; to[tot] = b; nextt[tot] = head[a]; head[a] = tot; w[tot] = c; } int main() { scanf("%d%d%d", &n, &m, &s); for (int i = 1; i <= m; i++) { int f, g, w; scanf("%d%d%d", &f, &g, &w); add(f, g, w); } for (int i = 1; i <= n; i++) d[i] = 2147483647; spfa(s); for (int i = 1; i <= n; i++) { if (s != i) printf("%d ", d[i]); else printf("0 "); } //while (1); return 0; }