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]);
        }
 
    }
 
 
}

 

posted on 2019-04-19 14:50  爱装逼的书呆子  阅读(184)  评论(0编辑  收藏  举报

导航