图论算法(四) Dijkstra算法

代码

#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;

const int INF = 0x3f3f3f3f;

struct Edge {
    int vertex, weight;
};

class Graph {
private:
    int n;
    vector<Edge> * edges;
    bool * visited;
public:
    int * dist;
    Graph (int input_n) {
        n = input_n;
        edges = new vector<Edge>[n];
        dist = new int[n];
        visited = new bool[n];
        memset(visited, 0, n);
        memset(dist, 0x3f, n * sizeof(int));
    }
    ~Graph() {
        delete[] dist;
        delete[] edges;
        delete[] visited;
    }
    void insert(int x, int y, int weight) {
        edges[x].push_back(Edge{y, weight});
        edges[y].push_back(Edge{x, weight});
    }
    void dijkstra(int v) {
        dist[v]=0; //从v出发,首先将v的距离设置为0(自己到自己)
        for(int i=0;i<n;i++){ //遍历所有其他结点
            int min_dist=INF,min_vertex;  //初始化一个最短距离和当前距离最短的节点
            for(int j=0;j<n;j++){
                if(!visited[j]&&dist[j]<min_dist){ 如果当前结点的距离比min_dist小则更新之
                    min_dist=dist[j];
                    min_vertex=j;
                }  
            }
            visited[min_vertex]=1;//标记已访问
            for (Edge& j:edges[min_vertex]){//遍历min_vertex的每一条边
                if(min_dist+j.weight<dist[j.vertex]){//如果当前的最小距离,加上边的距离小于j.vertex的距离的话就更新j.vertex的距离——这意味着j.vertex的距离没那么大
                    dist[j.vertex]=min_dist+j.weight;
                }
            }
        }
        
    }
};

int main() {
    int n, m;
    cin >> n >> m;
    Graph g(n);
    for (int i = 0; i < m; i++) {
        int a, b, c;
        cin >> a >> b >> c;
        g.insert(a, b, c);
    }
    g.dijkstra(0);
    for (int i = 0; i < n; i++) {
        cout << i << ": " << g.dist[i] << endl;
    }
    return 0;
}

Dijkstra算法的思路:
参见代码注释

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,235评论 25 709
  • 缘 (文/亦浓) 佛说,欢喜做,甘愿受。 所谓缘分,应该是天意的缘,争取的份。 有了缘,不作为,也不会有份。 想要...
    开在夜里的花儿阅读 2,463评论 14 11
  • 几个小时前你说:“你怕是还是不要来了吧” 从此 生命开始荒芜 2013年07.16姑且算一个开始吧 分不清,记不起...
    souvenirso阅读 2,675评论 11 5
  • 其实看似无坚不摧的人,才最怕受到伤害。他们把所有可能会伤害到自己的人挡在门外,杜绝所有可能伤害到自己的事情发生。给...
    李子树在下雪阅读 2,507评论 0 0
  • 语言艺术:被划分为好几门课,包括阅读,写作,拼写,语法。 数学:和国内的相比起来,教学范围是差不多的,但是教学:度...
    杰出道阅读 4,032评论 0 0

友情链接更多精彩内容