数据结构—多源最短路径
原理:参考趣学数据结构
代码:
栈代码:
# 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)
如果存在什么问题,欢迎批评指正!谢谢!