• Dijkstra算法——通过边实现松弛


     1 import java.util.Scanner;
     2 import java.util.LinkedList;
     3 import java.util.LinkedList;
     4 import java.util.Scanner;
     5 import java.util.TreeSet;
     6 import java.util.Scanner;
     7 public class One {
     8     public static void main(String args[]){
     9         int n,r;
    10         Scanner scanner=new Scanner(System.in);
    11         System.out.println("请输入点数、边:");
    12         n=scanner.nextInt();
    13         r=scanner.nextInt();
    14         int a[][]=new int[n+1][n+1];//存放路径路程的二维数组
    15         int dis[]=new int[n+1];//用于标记源点1到各点的距离
    16         int book[]=new int[n+1];//book[i]=1表示i点在集合p(确定源点到该点的最短路径)中,否则在集合q中
    17         //初始化二维数组
    18         for(int i=1;i<=n;i++){
    19             for(int j=1;j<=n;j++){
    20                 if(i==j)a[i][j]=0;
    21                 else a[i][j]=999;//999为无穷大,表示i到j没有直达路径
    22             }
    23         }
    24         System.out.println("请输入各边(有向)以及该边的距离:");
    25         for(int i=1;i<=r;i++){
    26             int x=scanner.nextInt();
    27             int y=scanner.nextInt();
    28             int d=scanner.nextInt();
    29             a[x][y]=d;
    30         }
    31         
    32         //Dijkstra算法
    33         //设定各项初值
    34         book[1]=1;//源点,其余为0
    35         //初始化dis
    36         for(int i=1;i<=n;i++)dis[i]=a[1][i];
    37         //sum用来计算book里面确定了最短源-点路径的数目,若为n,说明全部的源点到所有点的最短距离都确定
    38         int sum=1, j=0;
    39         while(true){
    40             int min=999;
    41             for(int i=2;i<=n;i++){
    42                 if(book[i]==0&&min>dis[i]){
    43                     min=dis[i];//求未定的离源点最短路程的点
    44                     j=i;//用于下个中转(松弛)
    45                 }
    46             }
    47             book[j]=1;
    48             sum++;
    49             if(sum==n)break;
    50             //松弛
    51             for(int i=2;i<=n;i++){
    52                 if(book[i]==0&&dis[i]>(dis[j]+a[j][i]))dis[i]=dis[j]+a[j][i];
    53             }
    54         }
    55         for(int i=1;i<=n;i++)System.out.print(dis[i]+" ");
    56     }
    57 }
    Dijkstra算法

    代码结果:

  • 相关阅读:
    codevs 1069关押罪犯
    codevs 1497取余运算
    codevs 3324 新斯诺克
    codevs 3286 火柴排队
    继续畅通工程
    还是畅通工程
    畅通工程(并查集找根节点)
    Eddy's picture(最小生成树)
    Constructing Roads(最小生成树)
    Codeforces Round #383 (Div. 2)C. Arpa's loud Owf and Mehrdad's evil plan
  • 原文地址:https://www.cnblogs.com/qinmeizhen/p/6831719.html
Copyright © 2020-2023  润新知