任务描述
本关任务:用邻接矩阵存储有向图,实现最短路径
Dijkstra
算法,图中边的权值为整型,顶点个数少于 10 个。
编程要求
根据提示,在右侧编辑器补充代码。
测试说明
输入描述:
首先输入图中顶点个数和边的条数; 再输入顶点的信息(字符型); 再输入各边及其权值。
输出描述:
依次输出从编号为0的顶点开始的从小到大的所有最短路径,每条路径及其长度占一行。
输入样例:
5 7
A B C D E
0 1 6
0 2 2
0 3 1
1 2 4
1 3 3
2 4 6
3 4 7
输出样例:
AD 1
AC 2
AB 6
ADE 8
#include <stdio.h>
#include <string.h>
#define MaxSize 10
#define INF 32767
typedef struct MGraph {
char vertex[MaxSize];// 顶点数组
int arc[MaxSize][MaxSize];// 边数组
int vertexNum, arcNum;// 顶点数和边数
} MGraph;
// 初始化图
void MGraph_init(MGraph *G, char a[], int n, int e) {
//write your code.
//========begin=======
G->vertexNum = n; G->arcNum = e;
for (int i=0; i<n; i++)
{
G->vertex[i] = a[i];
}
for (int i=0; i<n; i++)
{
for (int j=0; j<n; j++)
{
if (i == j)
{
G->arc[i][j] = 0;
}
else
{
G->arc[i][j] = INF;
}
}
}
int i, j, x;
for (int k=0; k<e; k++)
{
scanf("%d %d %d", &i, &j, &x);
G->arc[i][j] = x;
}
//=========end========
}
// 找到dist数组中最小值对应的顶点下标
int Min(int dist[], int vertexNum) {
//========begin=======
int index = 0, min = INF;
for (int i=0; i<vertexNum; i++)
{
if ((dist[i] != 0) && (dist[i] < min))
{
min = dist[i];
index = i;
}
}
return index;
//=========end========
}
// 将字符ch添加到字符串str的末尾
void strch(char str[], char ch) {
int l = strlen(str);
str[l] = ch;
str[l + 1] = '\0';
}
// Dijkstra算法求最短路径
void MGraph_Dijkstra(MGraph *G, int v) {
//========begin=======
int dist[MaxSize], num;
char path[20][20] = {'\0'};
for (int i=0; i<G->vertexNum; i++)
{
dist[i] = G->arc[v][i];
if (dist[i] != INF)
{
strch(path[i], G->vertex[v]);
strch(path[i], G->vertex[i]);
}
}
dist[v] = 0; num = 1;
while (num < G->vertexNum)
{
int k = Min(dist, G->vertexNum);
printf("%s %d\n", path[k], dist[k]);
for (int i=0; i<G->vertexNum; i++)
{
if (dist[i] > dist[k] + G->arc[k][i])
{
dist[i] = dist[k] + G->arc[k][i];
for (int j=0; path[k][j]; j++)
{
strch(path[i], path[k][j]);
}
strch(path[i], G->vertex[i]);
}
}
dist[k] = 0;
num++;
}
//=========end========
}
int main() {
int n, e;
scanf("%d %d", &n, &e);
char p[MaxSize];
int i;
for (i = 0; i < n; i++) {
scanf(" %c", &p[i]);
}
MGraph MG;
MGraph_init(&MG, p, n, e);
MGraph_Dijkstra(&MG, 0);
return 0;
}