zoukankan      html  css  js  c++  java
  • 算法初学-迪杰斯特拉算法(Dijkstra)

    ——————————————————————迪杰斯特拉算法————————————————————————

    目的:解决单元最短路径问题(从一个节点到另一个节点的最短路径)

    限制:不能处理带负边权的情况

    准备:

        map[][]:存储各条边的情况(注意是单向边,即map[1][2]是从点1到点2的距离,如果路不通,则将其中的值设置为足够大(表示此路不通))

        dist[]:记录数组,记录当前点到各个点的最短距离。

        set[]:标记数组,假设经过一个点V1,那么set[V1]=0要变为set[V1]=1,即该点已经被访问过。

    基本代码:

    JAVA版

     1 import java.util.Scanner;
     2 
     3 public class Dijkstra {
     4 
     5     public static void main(String[] args) {
     6         // TODO Auto-generated method stub
     7         Scanner scanner = new Scanner(System.in);
     8         int map[][] = new int[100][100];//矩阵
     9         int dist[] = new int[100];//距离数组
    10         int visited[] = new int[100];//标记数组
    11         int n = scanner.nextInt();
    12         
    13         //将每条通道设置为9999,即不可通过
    14         for(int i=1; i<=n;i++) {
    15             for(int j=1;j<=n;j++) {
    16                 map[i][j]=9999;
    17             }
    18         }
    19         
    20         int edges = scanner.nextInt();//路径数量
    21         for(int i=1;i<=edges;i++) {
    22             int a = scanner.nextInt();//起始点
    23             int b = scanner.nextInt();//终点
    24             map[a][b] = scanner.nextInt();
    25         }
    26         
    27         //初始化dist数组
    28         for(int i=1;i <= n;i++) {
    29             dist[i] = map[1][i];
    30         }
    31         
    32         
    33         int temp=0;//暂存,用来记录这个点与它相连点的最短距离的点的标号。
    34         for(int i=1;i<=n;i++) {
    35             int min=999;
    36             for(int j=1;j<=n;j++) {
    37                 if(visited[j]==0&&dist[j]<min) {
    38                     min = dist[j];
    39                     temp = j;
    40                 }
    41             }
    42             visited[temp] = 1;//标记该点已经来过
    43             
    44             //来更新dist数组的距离,可以理解为已经经过的点组成的图 到 未经过的图的最短距离。
    45             for(int k=1 ;k<=n;k++) {
    46                 if(dist[k]>dist[temp]+map[temp][k]) {
    47                     dist[k] = dist[temp] + map[temp][k];
    48                 }
    49             }
    50         }
    51         
    52         
    53         for(int i=1;i<=n;i++) {
    54             System.out.println(dist[i]);
    55         }
    56     
    57     }
    58 
    59 }
    View Code

     C++版

  • 相关阅读:
    .net批量插入SqlServer数据库的方法:
    Google主页中国元宵节
    左岸读书你是想读书,还是想读完书?
    Google主页中国著名教育家和画家 丰子恺先生 诞辰114周年
    【转载】图的遍历
    Google主页爱尔兰作家 布拉姆斯托克诞辰165周年
    诺基亚黯然关闭其在欧洲的最后一个手机工厂的背后
    [POJ 1012] Joseph(约瑟夫)
    台湾南投3.27地震
    左岸读书语不惊人死不休(95)
  • 原文地址:https://www.cnblogs.com/Angfe/p/13738052.html
Copyright © 2011-2022 走看看