普利姆(prim)算法与迪杰斯特拉(dijestella)算法

一:普利姆(prim)算法

对于临界矩阵表示的图,时间复杂度为O(|V|2)

对于邻接表表示的图,时间复杂度为O(|V|+|E|)

代码:

int dist[];//用来记录从原点到各个节点的距离
bool book[];//用来记录该节点是否被访问
void prim(){
    dist[1] = 0;//从源节点到自己节点的距离为零
    book[1] = true;//源 i++){
    dist[i] = min(dist[i], G[1][i]);//找到源节点到相邻节点的距离值,并写入dist[i]
    for(int i=2; i<=n;i++){
        int temp = INF;//定义一个无穷大参数
        int t=-1;//t记录新加入节点的偏移量
        for(int j=2; j<=n; j++){
            if(!book[j]&&dist[j]<temp){
                temp = dist[j];
                t = j;
            }
            if(t == -1){
                return 0;
            }
            else{
                book[t] = true;
                res+=dist[t];
                for(int j=2;j<=n; j++){
                    dist[j] = min(dist[j],G[t][j]);//更新dist[]中的值,只需要遍历新加入的节点到各个节点的距离即可
                }
            }
        }
    }
}

二: 迪杰斯特拉(dijestella)算法

迪杰斯特拉算法是用来寻找节点之间的最短路径的,所及基本代码思想与prim算法相似

代码:

int dist[];//记录各个节点到源节点的距离
boolen book[];
void djk(){
    dist[1]=0;//源到自己的距离是0
    book[1]=true;
    for(int i=2; i<=n; i++){
        dist[i] = G[1][i];
    }
    for(int i=2; i<=n; i++){
        int temp = INF;//无穷大
        int i = -1;
        for(int j=2; j<=n;j++){
            if(!book[j]&&dist[j]<temp){
                temp = dist[j];
                t = j;
            }
        }
        if (t = -1){
            return 0;
        }
        book[t] = true;
        res = res+dist[j];
        for(int j = 2; j<=n; j++){
            dist[j] = min(dist[j],G[t][j]+dist[j]);//与prim算法不同之处
        }
    }
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值