文件头:
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#define NOTEXIST -1
#define BEGIN -1
#define MAXVEX 100
#define INFINITY 65535
#define TRUE 1
#define FALSE 0
typedef int EdgeType;
typedef char VertexType;
int path[MAXVEX];
int dist[MAXVEX];
int known[MAXVEX];
typedef struct Graph {
VertexType vex[MAXVEX];
EdgeType edge[MAXVEX][MAXVEX];
int vex_num, edge_num;
}Graph;
核心代码:
void init_graph(Graph *g, int end)
{
int i;
for (i = 0; i < g->vex_num; i++) {
path[i] = NOTEXIST;
known[i] = FALSE;
dist[i] = INFINITY;
}
dist[end] = 0;
}
int find_min(Graph g)
{
int min;
min = INFINITY;
int i;
int index;
for (i = 0; i < g.vex_num; i++) {
if (known[i] == FALSE && dist[i] < min) {
index = i;
min = dist[i];
}
}
if (min == INFINITY)
return -1;
else
return index;
}
void Dijkstra(Graph g)
{
int v;
int w;
while (1) {
v = find_min(g);
//printf("v = %d", v);
if (v == NOTEXIST)
break;
known[v] = TRUE;
for (w = 0; w < g.vex_num; w++) {
if (known[w] == FALSE && (dist[v] + g.edge[v][w] < dist[w])) {
dist[w] = dist[v] + g.edge[v][w];
path[w] = v;
}
}
}
}
完整实现:
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#define NOTEXIST -1
#define BEGIN -1
#define MAXVEX 100
#define INFINITY 65535
#define TRUE 1
#define FALSE 0
typedef int EdgeType;
typedef char VertexType;
int path[MAXVEX];
int dist[MAXVEX];
int known[MAXVEX];
typedef struct Graph {
VertexType vex[MAXVEX];
EdgeType edge[MAXVEX][MAXVEX];
int vex_num, edge_num;
}Graph;
char read_char()
{
char ch;
do {
ch = getchar();
} while (!isalpha(ch));
return ch;
}
int get_pos(Graph g, char ch)
{
int i;
for (i = 0; i < g.vex_num; i++) {
if (g.vex[i] == ch)
return i;
}
return -1;
}
void create_graph(Graph *g)
{
int i, j, k;
printf("请输入顶点数与边数:\n");
scanf("%d%d", &g->vex_num, &g->edge_num);
for (i = 0; i < g->vex_num; i++) {
for (j = 0; j < g->vex_num; j++) {
if (i == j) {
g->edge[i][j] = 0;
}
else
g->edge[i][j] = INFINITY;
}
}
printf("请输入顶点信息:\n");
for (i = 0; i < g->vex_num; i++) {
g->vex[i] = read_char();
}
printf("请输入边的信息:\n");
char c1, c2;
int p1, p2, w;
for (k = 0; k < g->edge_num; k++) {
c1 = read_char();
c2 = read_char();
scanf("%d", &w);
p1 = get_pos(*g, c1);
p2 = get_pos(*g, c2);
g->edge[p1][p2] = w;//有向边的权重
}
}
void init_graph(Graph *g, int end)
{
int i;
for (i = 0; i < g->vex_num; i++) {
path[i] = NOTEXIST;
known[i] = FALSE;
dist[i] = INFINITY;
}
dist[end] = 0;
}
int find_min(Graph g)
{
int min;
min = INFINITY;
int i;
int index;
for (i = 0; i < g.vex_num; i++) {
if (known[i] == FALSE && dist[i] < min) {
index = i;
min = dist[i];
}
}
if (min == INFINITY)
return -1;
else
return index;
}
void Dijkstra(Graph g)
{
int v;
int w;
while (1) {
v = find_min(g);
//printf("v = %d", v);
if (v == NOTEXIST)
break;
known[v] = TRUE;
for (w = 0; w < g.vex_num; w++) {
if (known[w] == FALSE && (dist[v] + g.edge[v][w] < dist[w])) {
dist[w] = dist[v] + g.edge[v][w];
path[w] = v;
}
}
}
}
void print_graph(Graph g)
{
int i, j;
for (i = 0; i < g.vex_num; i++) {
for (j = 0; j < g.vex_num; j++) {
if (g.edge[i][j] == INFINITY)
printf("%5c", '*');
else {
printf("%5d", g.edge[i][j]);
}
}
printf("\n");
}
}
void print_path2(Graph g, int end)//这里 直接传递最后位置的索引
{
if (path[end] != BEGIN) {
print_path2(g, path[end]);
printf("->");
}
printf("%c ", g.vex[end]);
}
int main()
{
Graph g;
int start, end;
char c1, c2;
create_graph(&g);
printf("请输入起始点与终点:\n");
c1 = read_char();
c2 = read_char();
start = get_pos(g, c1);
end = get_pos(g, c2);
init_graph(&g,start);
Dijkstra(g);
if(dist[end] == INFINITY)
printf("\n该两点间无路径.");
else{
printf("最短路径为:\n\n");
print_path2(g, end);
printf("\n\n最小花费 : %d",dist[end]);
}
getchar();
getchar();
getchar();
return 0;
}