Floyd求最短路

思路:

(1)存图:由于点数小于200,为稀疏图,所以考虑用邻接矩阵存储,注意由于是最短路问题,所以存重边时只存最短的边即可。

(2)由于考察多源最短路,所以考虑floyd算法。

(2)floyd算法:对于任意两点,枚举任意跳板,更新最短距离。

代码:

#include

using namespace std;

const int INF = 0x3f3f3f3f;

int n;
int d[205][205];
void floyd()
{
    for(int k = 1;k <= n;k ++)
        for(int i = 1;i <= n;i ++)
            for(int j = 1;j <= n;j ++)
            {
                d[i][j] = min(d[i][j],d[i][k] + d[k][j]);
            }
}

int main()
{
    int m,k;
    cin >> n >> m >> k;
    
    for(int i = 1;i <= n;i ++)
        for(int j = 1;j <= n;j ++)
        {
            if(i == j)d[i][j] = 0;
            else d[i][j] = INF;
        }
       
    
    while(m --)
    {
        int x,y,z;
        cin >> x >> y >> z;
        
        d[x][y] = min(z,d[x][y]);
    }
    
    floyd();
    
    while(k --)
    {
        int x,y;
        cin >> x >> y;
        
        if(d[x][y] > INF/2)puts("impossible"); // 因为存在负权边,而负权边最多-2e8;
        else cout << d[x][y]<

你可能感兴趣的:(算法,图论,c++)