zoukankan      html  css  js  c++  java
  • 40-最短路

                 最短路

    问答问题反馈
    •  100%
    •  1000ms
    •  131072K
     

    在每年的比赛里,所有进入决赛的同学都会获得一件很漂亮的 t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?

    输入格式

    输入包括多组数据。

    每组数据第一行是两个整数 NN、MM(N le 100N100,M le 10000M10000),NN 表示大街上有几个路口,标号为 11 的路口是商店所在地,标号为 NN 的路口是赛场所在地,MM 则表示在成都有几条路。N=M=0N=M=0 表示输入结束。接下来 MM 行,每行包括 33 个整数 AA,BB,CC(1 le A,B le N,1 le C le 10001A,BN,1C1000),表示在路口 AA 与路口 BB 之间有一条路,我们的工作人员需要 CC 分钟的时间走过这条路。

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

    输出格式

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

    输出时每行末尾的多余空格,不影响答案正确性

    样例输入

    2 1
    1 2 3
    3 3
    1 2 5
    2 3 5
    3 1 2
    0 0

    样例输出

    3
    2

    import java.util.Scanner;
    
    public class Main {
    	public static int[][] map = new int[105][105];
    	public static int[] visit = new int[104];
    	public static int n, m;
    	public static int MAX = 0x3f3f3f3f;
    	
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Scanner cin = new Scanner(System.in);
    		n = cin.nextInt();
    		m = cin.nextInt();
    		while (n != 0 && m != 0) {
    			for(int i = 1; i <= n; i++) {
    				visit[i] = 0;
    				for(int j = 1; j <= n; j++) {
    					map[i][j] = MAX;
    				}
    			}
    			for(int i = 0; i < m; i++) {
    				int a, b, c;
    				a = cin.nextInt();
    				b = cin.nextInt();
    				c = cin.nextInt();
    				if(map[a][b] > c)
    					map[a][b] = map[b][a] = c;
    			}
    			System.out.println(dij(1));
    			n = cin.nextInt();
    			m = cin.nextInt();
    		}
    		
    	}
    	public static int dij(int s) {
    		int ans = 0;
    		int dist[] = new int[n+1];
    		for(int i = 1; i <= n; i++) {
    			dist[i] = map[s][i];
    		}
    		dist[s] = 0;
    		for(int i = 0; i < n; i++) {
    			int min = MAX;
    			int p = 0;
    			for(int j = 1; j <= n; j++) {
    				if(visit[j] == 0 && min > dist[j]) {
    					min = dist[j];
    					p = j;
    				}
    			}
    			if(p == 0) {
    				break;
    			}
    			visit[p] = 1;
    //			ans += min;
    			for(int j = 1; j <= m; j++) {
    				if(visit[j] == 0 && dist[j] > map[j][p] + min) {
    					dist[j] = map[j][p] + min;
    				}
    			}
    		}
    //		return ans;
    		return dist[n];
    	}
    
    }
    

      

  • 相关阅读:
    下拉菜单年月日
    把某些字符替换成**;
    单击向下滚动,单击停止滚动,下拉显示top,点击top返回顶部
    去除网页中的选中和右键菜单
    表单验证必须为6-12位英文字母去除首尾空格
    免费的海量编程中文书籍索引-都是干货【强烈建议收藏】
    图标搜索网站
    表单验证
    HDU 6319 Problem A. Ascending Rating(单调队列)
    Palindrome Function HDU
  • 原文地址:https://www.cnblogs.com/zhumengdexiaobai/p/10474259.html
Copyright © 2011-2022 走看看