dijkstra算法代码实现。输入:第一行,三个整数,$vn,en,s $,用空格分开,分别表示图G中:顶点数目(顶点编号从0开始),弧的数量(无向图每对顶点之间有两条弧),Dijkstra算法指定的起点。其中:1≤ vn ≤ 1000, 1≤ en ≤ vn×(vn-1)。注意:案例中提供的弧可以有重复的,图应该按照最后一次的弧的设置为准,即SetEdge的语义当存在该弧时,设置权值。 之后会有en行,每行表示一对顶点之间的一条弧,形式为:"<"+from+", "+to+", "+weight+">",其中from为弧的起点,to为弧的终点,weight为弧上权值(每对顶点之间的不同的弧上的权值可以不同)输出:共vn行,第i行表示编号为i的顶点(第i个顶点,i从0开始)到起点s的最短路径长度len,以及该最短路径中的前驱顶点p(起始顶点s的前驱设为自身顶点编号s)。示例:输入10 32 0 <2, 1, 2> <1, 2, 2> <5, 8, 52> <8, 5, 52> <1, 7, 141> <7, 1, 141> <0, 8, 185> <8, 0, 185> <3, 8, 43> <8, 3, 43> <7, 8, 136> <8, 7, 136> <1, 2, 122> <2, 1, 122> <6, 8, 150> <8, 6, 150> <2, 1, 6> <1, 2, 6> <6, 3, 16> <3, 6, 16> <7, 9, 34> <9, 7, 34> <3, 1, 10> <1, 3, 10> <8, 9, 193> <9, 8, 193> <7, 8, 49> <8, 7, 49> <0, 1, 198> <1, 0, 198> <0, 5, 179> <5, 0, 179>输出:<0, 0, 0> <1, 198, 0> <2, 204, 1> <3, 208, 1> <4, INF, 0> <5, 179, 0> <6, 224, 3> <7, 234, 8> <8, 185, 0> <9, 268, 7>
时间: 2023-06-12 19:05:47 浏览: 109
```cpp
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int maxn = 1e3 + 10;
const int maxm = 1e6 + 10;
int vn, en, s;
int head[maxn], cnt;
int dis[maxn], vis[maxn], p[maxn];
struct Edge {
int to, nxt, w;
}e[maxm];
inline void AddEdge(int u, int v, int w) {
e[++cnt].to = v;
e[cnt].w = w;
e[cnt].nxt = head[u];
head[u] = cnt;
}
inline void Init() {
memset(head, -1, sizeof(head));
memset(dis, INF, sizeof(dis));
memset(vis, 0, sizeof(vis));
memset(p, -1, sizeof(p));
cnt = -1;
}
inline void Dijkstra() {
priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > q;
q.push(make_pair(0, s));
dis[s] = 0;
while(!q.empty()) {
int u = q.top().second;
q.pop();
if(vis[u]) continue;
vis[u] = 1;
for(int i = head[u]; ~i; i = e[i].nxt) {
int v = e[i].to, w = e[i].w;
if(dis[v] > dis[u] + w) {
dis[v] = dis[u] + w;
p[v] = u;
q.push(make_pair(dis[v], v));
}
}
}
}
int main() {
Init();
scanf("%d%d%d", &vn, &en, &s);
for(int i = 1; i <= en; i++) {
int u, v, w;
char c;
scanf(" <%d, %d, %d%c", &u, &v, &w, &c);
AddEdge(u, v, w);
if(c != '>') {
scanf(" %c", &c);
scanf("%d", &w);
AddEdge(v, u, w);
}
}
Dijkstra();
for(int i = 0; i < vn; i++) {
if(dis[i] == INF) printf("<%d, INF, %d>\n", i, p[i]);
else printf("<%d, %d, %d>\n", i, dis[i], p[i]);
}
return 0;
}
```
阅读全文