• HDU 2544 最短路


    最短路

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


    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
     

    思路:采用 Dijistra 算法求最短路径

    import java.util.*;
    import java.io.*;
    public class Main {
    	public static int M=102;
    	public static int MAX=2000000;
    	public static int map[][]=new int[M][M];
    	public static LinkedList<Integer> list;
    	public static int n,m;
    	public static void main(String[] args) {
    		Scanner sc=new Scanner(new BufferedInputStream(System.in));
    		
    		while(sc.hasNextInt()){
    			// 初始化 地图
    			for(int i=0;i<M;i++){
    				for(int j=0;j<M;j++){
    					map[i][j]=MAX;
    				}
    			}
    			list=new LinkedList<Integer>();//从路口是商店所在地到各个路口之间的距离
    			n=sc.nextInt();
    			m=sc.nextInt();
    			if(n==0&&m==0) System.exit(0);//输入n==0和m==0 结束程序
    			for(int i=0;i<m;i++){
    				int a=sc.nextInt();
    				int b=sc.nextInt();
    				int time=sc.nextInt();
    				if(map[a][b]>time)
    					map[a][b]=map[b][a]=time;//同一条路来回走的时间是相同的
    			}
    			getDistance(1);
    			System.out.println(list.get(n));
    		}
    	}
    	
    	//Dijistra 算法
    	public static void getDistance(int v){
    		int k=0;
    		boolean[] boo=new boolean[M];//标志路口是否走过
    		for(int i=0;i<=n;i++){
    			list.add(map[v][i]);
    		}
    		boo[v]=true;//true表示已走过的路
    		list.set(v,0);
    		//判断各个路口
    		for(int i=0;i<=n;i++){
    			int min=MAX;
    			// 寻找到各个路口,所用最短的时间
    			for(int j=0;j<=n;j++){
    				if(!boo[j]&&list.get(j)<min){
    					min=list.get(j);
    					k=j;
    				}
    			}
    			boo[k]=true;
    			if(min==MAX) break;
    			//到一个新的路口,重新判断它到各个路口所用的时间
    			for(int j=0;j<=n;j++){
    				if(!boo[j]&&list.get(j)>list.get(k)+map[k][j]){
    					list.set(j,list.get(k)+map[k][j]);
    				}
    			}
    		}
    	}
    }
    


  • 相关阅读:
    Android实现不重复启动APP的方法
    Android之计算缓存大小并且清空缓存
    Android之SqlLite数据库使用
    Android之Socket通信、List加载更多、Spinner下拉列表
    BNU 4356 ——A Simple But Difficult Problem——————【快速幂、模运算】
    BJFU 1549 ——Candy——————【想法题】
    BJFU 1551 ——delightful world——————【暴搜】
    查找算法——————二分搜索
    Problem E: 积木积水 ——————【模拟】
    Whu 1604——Play Apple——————【博弈】
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3239182.html
Copyright © 2020-2023  润新知