hdu 最短路模板题 java

本文介绍了一个寻找从商店到赛场最短路径的问题,并提供了两种算法实现:SPFA算法和Floyd算法。通过输入不同路口间的时间消耗,算法可以计算出从起点到终点所需的最短时间。

最短路

 

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 77871    Accepted Submission(s): 33837

 

 

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 Output

 

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

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


}

 

Floyd

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

    }


}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值