Dijkstra的实现(用vector模拟邻接链表)

本文介绍了一种使用邻接链表而非传统的邻接矩阵来实现最短路径算法的方法。通过C++代码详细展示了如何构建邻接链表,并利用其进行最短路径的计算。
#include <stdio.h>
#include <vector>
using namespace std;

struct E{

    int next; //代表直接相邻的结点
    int c;
};

vector<E> edge[101]; //邻接链表
bool mark[101];
int Dis[101];

int main() {

    int n, m;

    while(scanf("%d %d", &n, &m) != EOF) {

        if(m == 0 && n == 0) break;

        for(int i = 1; i <= n; i ++) edge[i].clear();

        int a, b, c;

        while(m --) {

            scanf("%d%d%d", &a, &b, &c);

            E tmp;

            tmp.c = c;

            tmp.next = b;

            edge[a].push_back(tmp);

            tmp.next = a;

            edge[b].push_back(tmp);
        }

        for(int i = 1; i <= n; i ++) {

            Dis[i] = -1;

            mark[i] = false;
        }

        Dis[1] = 0; mark[1] = true;

        int newP = 1;

        for(int i = 1; i < n; i ++) {

            for(int j = 0; j < edge[newP].size(); j ++) {

                int t = edge[newP][j].next;

                int c = edge[newP][j].c;

                if(mark[t] == true) continue;

                if(Dis[t] == -1 || Dis[t] > Dis[newP] + c)
//若该结点尚不可达,或者从新加入的结点经过一条边到达时比以往更近
                        Dis[t] = Dis[newP] + c;
            }

            int min = 123123123;

            for(int j = 1; j <= n; j++) {

                if(mark[j] == true) continue;

                if(Dis[j] == -1) continue;

                if(Dis[j] < min) {

                    min = Dis[j];
                    newP = j;
                }
            }

            mark[newP] = true;
        }

        printf("%d\n", Dis[n]);
    }
    return 0;
}
 
以前只是用邻接矩阵实现过。。学习了。。。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值