zoukankan      html  css  js  c++  java
  • 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算法

    代码结果:

  • 相关阅读:
    Thrift实现C#调用Java开发步骤详解
    微信小程序项目实战之豆瓣天气
    带有关闭按钮的alertView
    基于olami开放语义平台的微信小程序遥知之源码实现
    iOS-仿智联字符图片验证码
    微信 支付宝支付 友盟登录分享 统计
    优化VMware提高虚拟机运行速度的技巧
    区块链与密码学
    在 Ubuntu 16.04 中安装支持 CPU 和 GPU 的 Google TensorFlow 神经网络软件
    Ubuntu+anaconda环境里安装opencv
  • 原文地址:https://www.cnblogs.com/qinmeizhen/p/6831719.html
Copyright © 2011-2022 走看看