zoukankan      html  css  js  c++  java
  • Dijkstra算法

    Dijkstra算法是解决单源的最短路径的算法。该算法对于负值的图无能为力。

    所谓单源,就是起点已确定,但是终点不同,不同点到起点的最短路径。

    Dijkstra算法的大体思路是先找到与起点A相邻的点且距离起点最近的点B,AB的距离为B到A距离最近的点。在从B相邻的点和之前的点中比较找到距离A最近的点C。

    如此循环往复,确定每个点到点A的距离是最短的。

    #include <bits/stdc++.h>

    using namespace std;

    typedef long long LL;

    const int INF = 0x3f3f3f3f;
    const int MAXN = 10000;
    int maps[MAXN+3][MAXN+3];//点到点的距离
    int dist[MAXN+3];//所求点到源点的距离
    int pre[MAXN+3];//键对应的值,该点的上一个点为值
    bool v[MAXN+3];//标记带点是否被使用
    void Dijstra(int n, int s) {
      for(int i = 1; i <= n; i++) {//初始化
        v[i] = false;
        if(i != s) {
        dist[i] = maps[s][i];
        pre[i] = s;//i的上一个点为s
        }
      }
      dist[s] = 0; v[s] = true;//s点到s点距离为零,s点以用过
      for(int i = 1; i <= n - 1; i++) {
        int minn = INF;
        int k = 0;
        for(int j = 1; j <= n; j++) {//找出哪个点到源点的距离最小
          if(!v[j] && dist[j] < minn) {
            minn = dist[j], k =j;
          }
        }  
        if(!k) return ;
        v[k] = true;
        for(int j = 1; j <= n; j++) {//刷新与k点相邻的点到源点的距离
          if(!v[j] && maps[k][j]!=INF && dist[j] > dist[k] + maps[k][j]) {
            dist[j] = dist[k] + maps[k][j];
            pre[j] = k;
          }
        }
      }
    }
      void init(int m) {//初始化
      for(int i = 0; i < m; i++) {
        for(int j = 0; j < m; j++) {
          maps[i][j] = INF;
        }
        pre[i] = i;
      }
    }
    int main() {
      //freopen("in.txt","r",stdin);
      //freopen("out.txt","w",stdout);
      int n, m, x, y, w;
      while(cin >> n >> m) {
        init(m);
        for(int i = 0; i < m; i++) {
          cin >> x >> y >> w;
          maps[x][y] = maps[y][x] = w;
        }
        Dijstra(n,1);
        for(int i = 1; i <= n; i++)
          cout << dist[i] << endl;
      }
      return 0;
    }

     

     

  • 相关阅读:
    linux下淘宝安全控件问题
    什么样的路由器有类似改hosts的功能
    linux 常见音乐、视频播放器简介
    把Ubuntu打造成Mac Macbuntu
    Linux桌面“彩”起来:桌面环境及窗口管理器大盘点
    听听各位对Ubuntu的UI的看法
    KVM虚拟机的创建、管理与迁移
    轻量级桌面 openbox + tint2 + conky + stalonetray + pcmanfm + xcompmgr
    ubuntu设置自动关机
    ubuntu sublime 破解
  • 原文地址:https://www.cnblogs.com/creativepower/p/6640839.html
Copyright © 2011-2022 走看看