题目
description:
编写程序,实现以邻接表作存储结构,求从源点到其余各顶点的最短路径的 Dijkstra算法。
input:
第一行输入顶点数 n 和边数 m;第二行输入顶点信息;分 m 行输入 m 对顶点 vi,vj(表示由顶点 vi 到顶点 vj(i 不等于 j)的边)以及该弧的权值。
output:
输出从源点到其余各顶点的最短路径(不可达用-1 表示)。
sample_input:
6 11
1 2 50
1 3 10
1 5 45
2 3 15
2 5 10
3 1 20
3 4 15
4 2 20
4 5 35
5 4 30
6 4 3
sample_output:
1 3 10
1 4 25
1 2 45
1 5 45
1 6 -1
思路
- 以邻接表作存储结构
/*边表*/
typedef struct ArcNode {
int adjvex; //该弧指向顶点的位置
int weight;//权值
struct ArcNode *nextarc; //指向下一条弧的指针
} ArcNode;
/*顶点表*/
typedef struct VertexNode {
int data; //顶点数据
ArcNode *firstarc; //指向该顶点第一条弧的指针
} VertexNode;
/*基于邻接表的图*/
typedef struct AdjList {
VertexNode vertex[MAX];
int vexnum, arcnum; //图的顶点数和弧数
} AdjList;
void createAdjList(AdjList *L, int n, int m) {
int i, j;
L->vexnum = n;
L->arcnum = m;
for (i = 0; i < n; i++) {
//输入顶点信息,初始化顶点表
L->vertex[i].data = i + 1; //1-6
L->vertex[i].firstarc = NULL;
}
int a, b, c; //a记录源点,b记录目标点,c记录权值
for (j = 0; j < m; j++) {
//输入边的信息,存储在边表中
cin >> a >> b >> c;
ArcNode *N = (ArcNode *)malloc(sizeof(ArcNode));
N->adjvex = b;
N->weight = c;
N->nextarc = L->vertex[a - 1].firstarc; //头插法
L-></