任务描述

本关任务:用邻接矩阵存储有向图,实现最短路径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;
}

 

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐