下面是C++代码
struct Edge {
int to;//代表以这条边为结尾的点的下标值
int next;//表示与第i条边同起点的上一条边的存储位置
int w;//代表这条边的边权数值
};
Edge edge[10005 * 2];
const int inf = 111111111;
int head[10005], cnt = 1;
void add(int u, int v, int w) {
edge[cnt].to = v;//表示第i条边的终点
edge[cnt].w = w;//表示第i条边的权值是多少
edge[cnt].next = head[u];//head[i]表示以i为起点最后一条边的存储位置
head[u] = cnt++;
}
for(int i=head[p];i != 0;i=nxt[i]) //我们可以通过head数组找到以p为开头的第一条边,并用nxt一直找下
//去,因为head数组最开始为1,所以当i等于0时,就是结束。
printf("%d %d %d\n",p,to[i],val[i]);
void spfa(int s,int n) {
queue<int>q;
//int u, v, w;
for (int i = 0; i < n + 5; i++) {
dis[i] = inf;
vis[i] = 0;
}
vis[s] = 1;
dis[s] = 0;
q.push(s);
while (!q.empty()) {
int m = q.front();
q.pop();
vis[m] = 0;
for (int i = head[m]; i != 0; i = edge[i].next) {
int y = edge[i].to;
if (dis[m] + edge[i].w < dis[y]) {
dis[y] = dis[m] + edge[i].w;
if (!vis[y]) {
vis[y] = 1;
q.push(y);
}
}
}
}
}