zoukankan      html  css  js  c++  java
  • hdu 最短路模板题 java

    最短路

    Problem Description

    在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的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 Outpu

    3 2

    Source

    UESTC 6th Programming Contest Online

    Recommend

    lcy   |   We have carefully selected several similar problems for you:  1142 1596 1690 1598 2923 

    SPFA:

    邻接表实现: 二维数组, 第一维大小固定,为图中节点数,采用数组实现, 第二维大小不固定,采用arraylist实现。 与hashmap的结构类似,数组加链表实现。

    import java.util.ArrayList;
    import java.util.LinkedList;
    import java.util.Queue;
    import java.util.Scanner;
     
    public class Main
    {
        static int maxn=100005;
        static ArrayList<Edge>[] G = new ArrayList[maxn];
        static class Edge
        {
            public int e;
            public int w;
            Edge(){}
            Edge(int e,int w){this.e=e;this.w=w;}
        }
        public static void main(String []args)
        {
            Scanner in =new Scanner(System.in);
            while (in.hasNext())
            {
                for(int i=0;i<G.length;i++) {G[i]=new ArrayList<>();}
     
                int n=in.nextInt();int m=in.nextInt();
                if(n==0&&m==0) return;
                for (int i = 0; i < m; i++)
                {
                    int s = in.nextInt();
                    int e = in.nextInt();
                    int w = in.nextInt();
                    G[s].add(new Edge(e,w));
                    G[e].add(new Edge(s,w));
                }
                System.out.println(spfa(1, n));
            }
     
        }
     
     
        static int spfa(int v, int et)
        {
            Queue<Integer> q = new LinkedList<>();
            int[] dist = new int[maxn];
            int[] vis = new int[maxn];
            for (int i = 0; i < dist.length; i++){ dist[i] = Integer.MAX_VALUE;}
     
            q.offer(v);
            dist[v]=0;
            vis[v]=1;
            while (!q.isEmpty())
            {
                int s = q.poll();
                vis[s]=0;       //记得恢复未访问标记
                for (int i = 0; i < G[s].size(); i++)
                {
                    int e = G[s].get(i).e;
                    int w = G[s].get(i).w;
                    if (dist[e] > dist[s] + w)
                    {
                        dist[e]=dist[s]+w;
                        if (vis[e] == 0)
                        {
                            vis[e] = 1;
                            q.offer(e);
                        }
                    }
                }
            }
            return dist[et];
        }
     
     
    }

    Floyed 

    import java.util.Scanner;
     
    public class Main2544_2
    {
        static int maxn=100005;
        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 [][]d=new int[n+1][n+1];
                for (int i=1;i<=n;i++)
                    for(int j=1;j<=n;j++)
                        d[i][j]=maxn;
     
                for (int i = 0; i < m; i++)
                {
                    int s = in.nextInt();
                    int e = in.nextInt();
                    int w = in.nextInt();
                    if(w<d[s][e])
                    {
                        d[s][e]=d[e][s]=w;
                    }
                }
     
                //注意这里的顺序
                for(int k=1;k<=n;k++)
                    for(int i=1;i<=n;i++)
                        for(int j=1;j<=n;j++)
                            d[i][j]=Math.min(d[i][j],d[i][k]+d[k][j]);
                System.out.println(d[1][n]);
            }
     
        }
     
     
    }
  • 相关阅读:
    jxl读和取Excel文件
    Studio for WPF:定制 C1WPFChart 标记
    为C1Chart for WPF添加自定义标题、坐标轴单位标签以及旋转坐标轴注释
    自定义饼图(PieChart)各个PieSlice的外观
    vue组件
    vue双向绑定
    第一个Vue程序
    vue入门介绍
    js生成随机固定长度字符串的简便方法
    JavaScript 函数式编程读书笔记1
  • 原文地址:https://www.cnblogs.com/xianbin7/p/10735915.html
Copyright © 2011-2022 走看看