解题思路:
这道题要求使用邻接来作为储存结构,使用Dijkstra算法计算源点到其余各点的最短距离,无法到达时令距离为-1.
了解一下Dijkstra算法:
而根据题目预期的Output来看,输出数据是按照最短路径升序输出的,因此我们还要对数据进行一次排序,最短路径升序优先,其次是目标点序号,之后将最短路径为-1的放在最后输出。
具体操作见代码,代码中有部分注释。
题解代码:
#include<stdio.h>
#include<stdlib.h>
#define MAX 200
#define NUMMAX 10000
#define FALSE 0
#define TRUE 1
typedef struct EdgeNode{
int endvex;//相邻顶点字段
int weight;//边的权
struct EdgeNode *nextedge;//链字段
}EdgeList;//边表
typedef struct{
int vertex;//顶点信息
EdgeList *edgelist;//边表头指针
}VexNode;//顶点表
typedef struct{
VexNode vexs[MAX];
int vexNum,edgeNum;//图的顶点和边个数
}GraphList;
typedef struct path{
int visited[MAX];
int pathweight[MAX];
}Path;
void CreatGraphList(GraphList *G, int n, int m){
G->vexNum = n;
G->edgeNum = m;
for(int i=0;i<n;i++){
G->vexs[i].vertex = i+1;
G->vexs[i].edgelist = NULL;
}
int v1,v2,w;
for(int j=0;j<m;j++){
scanf("%d %d %d",&v1,&v2,&w);
EdgeList *g = (EdgeList*)malloc(sizeof(EdgeList));