Floyd_Warshall算法

/**/ /**
 * FLOYD_WARSHALL 所有顶点对的最短路径算法 (All-Pairs Shortest Path Algorithm)
 * 输入:图g
 * 输出:所有顶点对的最短路径长
 * 结构:图g用邻接矩阵表示
 * 算法:Floyd_Warshall算法(动态规划)
 * 复杂度:O(|V|^3) 
 
*/

#include 
< iostream >
#include 
< string >
#include 
< vector >
#include 
< deque >
#include 
< list >
#include 
< stack >
#include 
< queue >
#include 
< iterator >
#include 
< algorithm >
#include 
< numeric >
#include 
< functional >
#include 
< climits >
using   namespace  std;

int  n;
vector
< vector < int >   >  g;
vector
< vector < int >   >  dist;

void  Floyd_Warshall()
{
    
// 初始化dist,顶点间(无中间顶点)最短路径长为边长,顶点到自身的最短路径长为0。 
    dist = g;
    
for (int i = 0; i < n; ++i)  
        dist[i][i] 
= 0;
    
// 从顶点i到定点j且中间顶点皆属于集合{0, 1, 2, , k}的最短路径长。 
    for (int k = 0; k < n; ++k)
        
for (int i = 0; i < n; ++i)
            
for (int j = 0; j < n; ++j)
                
if (dist[i][k] < INT_MAX && dist[k][j] < INT_MAX)
                    dist[i][j] 
= min(dist[i][j], dist[i][k] + dist[k][j]);
}


int  main()
{
    n 
= 5;    
    g.assign(n, vector
<int>(n, INT_MAX));
    g[
0][1= 3; g[0][2= 8; g[0][4= -4;
    g[
1][3= 1; g[1][4= 7;
    g[
2][1= 4
    g[
3][0= 2; g[3][2= -5;
    g[
4][3= 6;
     
    Floyd_Warshall();
    
    
for (int i = 0; i < n; ++i)
    
{
        
for (int j = 0; j < n; ++j)
            cout 
<< dist[i][j] << ' ';
        cout 
<< endl;        
    }

    
    system(
"pause");
    
return 0;
}

你可能感兴趣的:(Floyd_Warshall算法)