浙大数据结构习题笔记:Floyd算法(多源有权图最短路)

Floyd算法(多源有权图最短路)

具体实现请看慕课
原理就是一个三层循环,逐层遍历出结果安插到备用的两个二重矩阵中间,可以看错Dijkstra算法的多源化

具体代码实现

#include<iostream>
#include<stdlib.h>
#define INF 1000000
#define MaxVertex 100
typedef int Vertex;
int G[MaxVertex][MaxVertex];
int dist[MaxVertex][MaxVertex];  // 距离
int path[MaxVertex][MaxVertex];  // 路径
int Nv;   // 顶点
int Ne;   // 边
using namespace std;

// 初始化图信息
void build(){
    Vertex v1,v2;
    int w;
    printf("Enter Nv:");
    cin>>Nv;
    // 初始化图
    for(int i=1;i<=Nv;i++)
        for(int j=1;j<=Nv;j++)
            G[i][j] = INF;
    printf("Enter Ne:");
    cin>>Ne;
    // 初始化点
    for(int i=0;i<Ne;i++){
        printf("Enter each edge:");
        cin>>v1>>v2>>w;
        G[v1][v2] = w;
        G[v2][v1] = w;
    }
}

void Floyd(){
    for(Vertex i=1;i<=Nv;i++)
        for(Vertex j=1;j<=Nv;j++){
            dist[i][j] = G[i][j];
            path[i][j] = -1;
        }
    for(Vertex k=1;k<=Nv;k++)
        for(Vertex i=1;i<=Nv;i++)
            for(Vertex j=1;j<=Nv;j++)
                if(dist[i][k] + dist[k][j] < dist[i][j]){
                    dist[i][j] = dist[i][k] + dist[k][j];
                    path[i][j] = k;
                }
}

void output(){
    for(Vertex i=1;i<=Nv;i++){
        for(Vertex j=1;j<=Nv;j++)
            cout<<dist[i][j]<<" ";
        cout<<endl;
    }
    cout<<endl;
    for(Vertex i=1;i<=Nv;i++){
        for(Vertex j=1;j<=Nv;j++)
            cout<<path[i][j]<<" ";
        cout<<endl;
    }
}


int main(){
    build();
    Floyd();
    output();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值