Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 903|回复: 0

[算法学习]三种算法解HDU2544(Floyd、Dijkstra、SPFA)求单源点最短路径

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-12-4 00:08:05 | 显示全部楼层 |阅读模式
    题(HDU2544):
          在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?

    Input
       输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。

    接下来M行,
    每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。

    输入保证至少存在1条商店到赛场的路线。
       
      
       
       

         
       

         
       
      



    Output

       对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间



    Sample Input

    2 1

    1 2 3

    3 3

    1 2 5

    2 3 5

    3 1 2

    0 0





    Sample Output

    3

    2




    import java.util.Scanner;
    import java.util.Queue;
    import java.util.LinkedList;
    public class Main{
    static final int INF = 99999999;
    private int map[][];//邻接矩阵
    private int dist[];//最终存放从商店到各路口的最短距离
    private boolean visit[];//visit标记dist是否已经求出。
    private int n;//路口和道路数(顶点和边数)
    public Main(int n,int[][] map){
        this.n=n;
        this.map=map;
        dist=new int[n+1];
    }
       

    private void floyd(){ //Floyd算法
         for(int k = 1; k <= n; k++)     //k为中间点
            for(int i = 1; i <= n; i++)
                for(int j = 1; j <= n; j++)
                    if(map[k] + map[k][j] <  map[j]){
                       map[j] = map[k] + map[k][j];
                }
        System.out.println(map[1][n]);
      }
    private void dijk() {    //Dijkstra算法
        int  next=0, MIN;
        visit=new boolean[n+1];
        for(int i =1; i <= n; i++) dist = INF;
        dist[1] = 0;
        for(int i = 1; i <= n; i++) {
            MIN = INF;
            for(int j = 1; j <= n; j++)
                if(!visit[j] && dist[j] <= MIN){
                    MIN = dist[j];
                    next=j;
                }
            if(MIN == INF) break;
            visit[next] = true;
            for(int j = 1; j <= n; j++)
                if(!visit[j] && dist[j] > dist[next] + map[next][j])
                    dist[j] = dist[next] + map[next][j];
        }
        System.out.println(dist[n]);
    }
    private void spfa(){     //SPFA算法
        int now;
        visit=new boolean[n+1];
        for(int i = 1; i <= n; i++) dist = INF;
        dist[1] = 0;
        Queue<Integer> Q=new LinkedList<Integer>();
        Q.offer(1);
        visit[1] = true;
        while(!Q.isEmpty()){
            now = Q.poll();
            visit[now] = false;
            for(int i = 1; i <= n; i++){
                if(dist > dist[now] + map[now]){
                    dist = dist[now] + map[now];
                    if(visit == false)
                    {
                        Q.offer(i);
                        visit = true;
                    }
                }
            }
        }
      System.out.println(dist[n]);
    }
    public static void main(String[] args){
       Scanner in=new Scanner(System.in);
        while(in.hasNext()) {
           int n=in.nextInt();//图的顶点数
           int m=in.nextInt();//边数
           if(n==0&&m==0) break;
           int[][] map=new int[n+1][n+1];
           for(int i = 1; i <= n; i++){//初始化
            for(int j = 1; j <= n; j++){
                if(i == j) map[j] = 0;
                else{
                 map[j] = map[j] = INF;
                }
            }
          }
           int vi, vj, cost;
         
           while(m-->0){//m条边的数据
            vi=in.nextInt();
            vj=in.nextInt();
            cost=in.nextInt();
            
            if(cost < map[vi][vj]){
                map[vi][vj] = map[vj][vi] = cost;
            }
           }
          Main ma=new Main(n,map);
          //  ma.floyd();
          //  ma.dijk();
          ma.spfa();
          
        }
      }
    }
    [/code]






      
      
       
       

         
       

         
       
      
    复制代码

    源码下载:http://file.javaxxz.com/2014/12/4/000805000.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 04:08 , Processed in 0.372715 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表