<span style="font-size:18px;"><span style="font-size:18px;">#include
#include
#include
#include
#include
using namespace std ;
#define MAXN 1000
#define INF 1000000
int map[MAXN][MAXN] ;
int visit[MAXN] ;
int pre[MAXN] ;
int dist[MAXN] ;
int path[MAXN] ;
int top ;
struct node{
int p ;
int value ;
friend bool operator < (node a , node b ){
return a.value > b.value ;
}
};
priority_queue Q ;
queue q ;
struct Edge
{
int to ;
int w ;
int next ;
}edge[MAXN*MAXN];
void addedge(int x ,int y , int w )
{
edge[top].to = y ;
edge[top].w = w ;
edge[top].next = pre[x] ;
pre[x] = top ;
top++ ;
}
void init (int n, int m)
{
int i , j ;
top = 1 ;
memset(pre , -1 ,sizeof(pre)) ;
for(i = 1 ;i <= n ; i++)
dist[i] = INF ;
dist[1] = 0 ;
for(i = 1 ;i <= n ; i++){
for(j = 1 ;j <= n ; j++){
map[i][j] = INF ;
}
}
for(i = 1 ;i <= m ; i++){
int x ,y , w ;
scanf("%d%d%d" ,&x ,&y , &w) ;
if(map[x][y] < w) continue ;
addedge(x,y,w) ;
addedge(y,x,w) ;
map[x][y] = map[y][x] = w ;
}
}
void floyd(int n )
{
int i ,j , k ;
for(k = 1 ;k <= n ; k++)
for(i = 1 ;i <= n ;i++)
for(j = 1 ; j <= n ;j++ )
if(j != k && i != j && i != k && map[i][j] > map[i][k] + map[k][j])
map[i][j] = map[i][k] + map[k][j] ;
}
int main()
{
int m , n ;
int i , j ;
int ans[MAXN] ;
while(scanf("%d%d" ,&n, &m )!=EOF ){
if(n == 0 && m == 0) break ;
init(n ,m) ;
floyd (n) ;
printf("请输入要查询的两个点\n") ;
int x ,y ;
scanf("%d%d" ,&x , &y) ;
printf("%d\n" ,map[x][y]) ;
}
return 0;
}</span></span>
Algorithm 最短路径之 floyd (适用于 多点距离)
最新推荐文章于 2024-05-22 13:02:54 发布