码迷,mamicode.com
首页 > 其他好文 > 详细

《啊哈!算法》第6章最短路径

时间:2014-06-24 21:48:25      阅读:290      评论:0      收藏:0      [点我收藏+]

标签:style   class   blog   code   http   tar   

第一节 Floyd-Warshall算法

本算法可以求任意两个点之间的最短路径,又称“多源最短路径”,其时间复杂度为O(n^3)

其核心部分只有下面几行,注意加法的溢出处理

    //floyd最短路径算法的核心部分
    for(int k = 0; k < n; ++ k){
        for(int i = 0 ; i < n ; ++ i){
            for(int j = 0 ; j < n ; ++ j){
                if(grid[i][k]!=INT_MAX && grid[k][j]!=INT_MAX &&grid[i][j] > grid[i][k]+grid[k][j]){
                    grid[i][j] = grid[i][k] + grid[k][j];
                    path[i][j] = k;
                }
            }
        }
    }

 

bubuko.com,布布扣
/*
 *基于有向图的floyd最短路径算法
 *floyd算法不能解决带有“负权回路”的图
 */

#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
#include <cstdio>
using namespace std;

typedef vector<vector<int> > VVI;

void floyd(VVI& grid, VVI& path){
    int n = grid.size();
    //floyd最短路径算法的核心部分
    for(int k = 0; k < n; ++ k){
        for(int i = 0 ; i < n ; ++ i){
            for(int j = 0 ; j < n ; ++ j){
                if(grid[i][k]!=INT_MAX && grid[k][j]!=INT_MAX &&grid[i][j] > grid[i][k]+grid[k][j]){
                    grid[i][j] = grid[i][k] + grid[k][j];
                    path[i][j] = k;
                }
            }
        }
    }
}

void print(int x, int y, VVI& path){
   int k = path[x][y];
   //cout<<"k="<<k<<endl;
   if(k==-1) return;
   print(x,k,path);
   printf("%d->",k);
   print(k,y,path);
}

int main(){
    int n,m;
    cin >> n >> m;
    VVI grid(n,vector<int>(m,INT_MAX));
    for(int i = 0 ; i < n; ++ i) grid[i][i] = 0;
    for(int i = 0 ; i < m; ++ i){
        int a,b,e;
        cin >> a >> b >> e;
        grid[--a][--b] = e;
    }
    VVI path(n,vector<int>(m,-1));
    floyd(grid,path);
    //输出最终的结果
    cout<<string(30,=)<<endl;
    printf("start\tend\tlength\tpath\n");
    for(int i = 0 ; i < n ; ++ i){
        for(int j = 0 ;  j < n; ++ j){
            printf("%4d\t%4d\t%4d\t",i+1,j+1,grid[i][j]);
            printf("%d->",i+1);
            print(i,j,path);
            printf("%d\n",j+1);
        }
        //printf("\n");
    }
    cout<<string(30,=)<<endl;
    return 0;
}
floyd最短路径算法

 第二节 Dijkstra算法-通过边实现松弛

《啊哈!算法》第6章最短路径,布布扣,bubuko.com

《啊哈!算法》第6章最短路径

标签:style   class   blog   code   http   tar   

原文地址:http://www.cnblogs.com/xiongqiangcs/p/3805689.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!