如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度。
第一行包含三个整数N、M、S,分别表示点的个数、有向边的个数、出发点的编号。
接下来M行每行包含三个整数Fi、Gi、Wi,分别表示第i条有向边的出发点、目标点和长度。
输出格式:
一行,包含N个用空格分隔的整数,其中第i个整数表示从点S出发到点i的最短路径长度(若S=i则最短路径长度为0,若从点S无法到达点i,则最短路径长度为2147483647)
时空限制: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 <vector> #include <queue> #include <cstring> #define INF 2147483647 using namespace std; const int maxn = 10010; struct Edge { int from, to, dist; Edge(int u, int v, int d) : from(u), to(v), dist(d) {} }; struct HeapNode { int d, u; bool operator<(const HeapNode &rhs) const { return d > rhs.d; } }; int n, SizeM, d[maxn]; vector<Edge> edges; vector<int> G[maxn]; bool done[maxn]; void init() { for (int i = 0; i < n; i++) G[i].clear(); } void AddEdge(int from, int to, int dist) { edges.push_back(Edge(from, to, dist)); SizeM = edges.size(); G[from].push_back(SizeM - 1); } void dijkstra(int S) { priority_queue<HeapNode> Q; for (int i = 0; i < n; i++) d[i] = INF; d[S] = 0; memset(done, 0, sizeof(done)); Q.push((HeapNode){0, S}); while (!Q.empty()) { HeapNode x = Q.top(); Q.pop(); int u = x.u; if (done[u]) continue; done[u] = true; for (int i = 0; i < G[u].size(); i++) { Edge &e = edges[G[u][i]]; if (d[e.to] > d[u] + e.dist) { d[e.to] = d[u] + e.dist; Q.push((HeapNode){d[e.to], e.to}); } } } } int main() { int S, from, to, dist, m; scanf("%d%d%d", &n, &m, &S); init(); for (int i = 0; i < m; i++) { scanf("%d%d%d", &from, &to, &dist); AddEdge(from - 1, to - 1, dist); } dijkstra(S - 1); for (int i = 0; i < n; i++) { if (i) printf(" "); printf("%d", d[i]); } printf("\n"); return 0; }