采用邻接矩阵存储图,打印顶点1到其他各点的最短路径长度。
#include<stdio.h>
#define MAXSIZE 10
#define INF 100
int dist[MAXSIZE];
int path[MAXSIZE];
int visited[MAXSIZE];
struct Graph
{
int vertex[MAXSIZE];
int arc[MAXSIZE][MAXSIZE];
int vertexnum, arcnum;
};
void graphcreate(struct Graph* graph)
{
for (int i = 1; i <= graph->vertexnum; i++)
{
for (int j = 1; j <= graph->vertexnum; j++)
{
graph->arc[i][j] = INF;//初始化
}
}
int a, b, w;
for (int i = 1; i <= graph->arcnum; i++)
{
printf("输入边所依附的两个顶点及其权重:\n");
scanf("%d%d%d", &a, &b, &w);
graph->arc[a][b] = w;//构造邻接矩阵
}
}
void dijsktra(struct Graph* graph,int from,int to)
{
for (int i = 1; i <= graph->vertexnum; i++)
{
visited[i] = 0;//初始化访问数组
dist[i] = graph->arc[from][i];//初始化距离数组
}
for (int i = 1; i <= graph->vertexnum; i++)
{
if (dist[i] != INF) path[i] = from;//初始化路径数组
else path[i] = -1;
}
for (int i = 1; i < graph->vertexnum; i++)
{
int min = INF;
int pos;
for (int j = 1; j <= graph->vertexnum; j++)
{
if (!visited[j] && dist[j] < min)
{
min = dist[j]
;
pos = j;
}
}
visited[pos] = 1;
for (int j = 1; j <= graph->vertexnum; j++)
{
if (!visited[j] && graph->arc[pos][j] + dist[pos] < dist[j])
{
dist[j] = graph->arc[pos][j] + dist[pos];
path[j] = pos;
}
}
}
printf("顶点1到%d的最短路径长度为:\n",to);
printf("%d\n", dist[to]);
}
int main()
{
struct Graph graph;
printf("输入顶点和边的个数:\n");
scanf("%d%d", &graph.vertexnum, &graph.arcnum);
graphcreate(&graph);
for (int i = 2; i <= graph.vertexnum; i++)
{
dijsktra(&graph, 1, i);
}
return 0;
}
测试用例及结果: