数据结构—多源最短路径
原理:参考趣学数据结构
代码:
栈代码:
#pragma once
#include<stdio.h>
#define maxSize 100
typedef struct stack {
int * base;
int * top;
}stack;
bool init(stack & Stack) {
Stack.base = new int[maxSize];
if (!Stack.base) {
return false;
}
Stack.top = Stack.base;
return true;
}
bool push(stack & Stack,int e) {
if (Stack.top - Stack.base == maxSize) {
return false;
}
*(Stack.top) = e;
Stack.top++;
return true;
}
bool pop(stack & Stack, int &e) {
if (Stack.base == Stack.top) {
return false;
}
Stack.top--;
e = *(Stack.top);
return true;
}
int getTop(stack &Stack) {
if (Stack.base == Stack.top) {
return -1;
}
return *(Stack.top - 1);
}
void printStack(stack Stack) {
while (Stack.base != Stack.top) {
printf("%d ", *(Stack.top - 1));
Stack.top--;
}
}
bool empty(stack Stack) {
if (Stack.base == Stack.top) {
return true;
}
return false;
}
void testStack() {
stack Stack;
init(Stack);
int value;
while (1) {
scanf_s("%d", &value);
if (value == -1) {
break;
}
push(Stack, value);
}
printStack(Stack);
}
多源最短路径代码:
#include<stdio.h>
#include<stdlib.h>
#include"stack.h"
#define N 100
#define elemType int
#define INF (((unsigned int)(-1)) >> 1)
typedef struct GraphMatrix {
elemType vNode[N][N];
int vNum, eNum;
}GraphMatrix;
void findPath(GraphMatrix G, int dist[N][N], int p[N][N],stack &Stack);
void initGMaxtix(GraphMatrix &G) {
printf("输入顶点数和边数\n");
scanf_s("%d%d", &G.vNum, &G.eNum);
for (int i = 0; i < G.vNum; i++) {
for (int j = 0; j < G.vNum; j++) {
G.vNode[i][j]= INF;
}
}
printf("输入顶点v1到顶点v2和其边的权重\n");
for (int i = 0; i < G.eNum; i++) {
int v1, v2, weights;
scanf_s("%d%d%d", &v1, &v2, &weights);
G.vNode[v1][v2] = weights;
}
}
void print10(GraphMatrix G) {
printf("邻接矩阵如下:\n");
for (int i = 0; i < G.vNum; i++) {
for (int j = 0; j < G.vNum; j++) {
printf("%d ", G.vNode[i][j]);
}
printf("\n");
}
}
void print101(int result[N][N], int length) {
for (int i = 0; i < length; i++) {
for (int j = 0; j < length; j++) {
printf("%d ", result[i][j]);
}
printf("\n");
}
printf("\n");
}
void Floyd(GraphMatrix G) {
int dist[N][N], p[N][N];
for (int i = 0; i < G.vNum; i++) {
for (int j = 0; j < G.vNum; j++) {
dist[i][j] = G.vNode[i][j];
if (G.vNode[i][j] == INF || i==j ) {
p[i][j] = -1;
}
else {
p[i][j] = i;
}
}
}
for(int k=0;k<G.vNum;k++){
for (int i = 0; i < G.vNum; i++) {
for (int j = 0; j < G.vNum; j++) {
if (dist[i][k]<INF && dist[k][j]<INF && dist[i][k] + dist[k][j] < dist[i][j]) {
dist[i][j] = dist[i][k] + dist[k][j];
p[i][j] = p[k][j];
}
}
}
}
stack Stack;
init(Stack);
printf("输出多源最短路径的最优方案\n");
findPath(G, dist, p,Stack);
}
void findPath(GraphMatrix G, int dist[N][N], int p[N][N], stack &Stack) {
for (int i = 0; i < G.vNum; i++) {
for (int j = 0; j < G.vNum; j++) {
if (p[i][j] == -1) {
printf("%d---%d不可达!\n", i, j);
continue;
}
push(Stack, j);
int x = p[i][j];
while (x != -1) {
push(Stack, x);
x = p[i][x];
}
int e;
while (!empty(Stack)) {
printf("%d", getTop(Stack));
pop(Stack, e);
if (Stack.top - Stack.base >= 1) {
printf("---");
}
}
printf(" 这段路径的距离为:%d\n", dist[i][j]);
}
}
}
int main() {
GraphMatrix G;
initGMaxtix(G);
print10(G);
printf("\n");
Floyd(G);
system("pause");
return 0;
}
测试截图:
时间复杂度为O(n x n x n),空间复杂度为O(n x n)
如果存在什么问题,欢迎批评指正!谢谢!