zoukankan      html  css  js  c++  java
  • 最短路径及花费 dijskra算法

    题目描述:
    给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
    输入:
    输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点t。n和m为0时输入结束。
    (1<n<=1000, 0<m<100000, s != t)
    输出:
    输出 一行有两个数, 最短距离及其花费。
    样例输入:
    3 2
    1 2 5 6
    2 3 4 5
    1 3
    0 0
    样例输出:
    9 11
    
    
    
    
    package 浙大;
    import java.io.BufferedInputStream;
    import java.util.Arrays;
    import java.util.Scanner;
    public class 最短路径及花费 {
    static int arr[][];
    static int cost[][];
    static int dist[];
    static int money[];
    static boolean isOK[];
    static int n;
    static int m;
    static final int MAX = Integer.MAX_VALUE;
    public static void main(String[] args) {
    Scanner s = new Scanner(new BufferedInputStream(System.in));
    while(s.hasNextInt()){
    n = s.nextInt();
    m = s.nextInt();
    if(n==0 && m==0)
    break;
    arr = new int[n][n];
    cost = new int[n][n];
    dist = new int[n];
    money = new int[n];
    isOK = new boolean[n];
    for(int[] a:arr)
    Arrays.fill(a, MAX);
    for(int[] a:cost)
    Arrays.fill(a, MAX);
    for(int i=0; i<m; i++){
    int a = s.nextInt()-1;
    int b = s.nextInt()-1;
    int c = s.nextInt();
    int d = s.nextInt();
    if(c < arr[a][b] ){ //如果有更小的路径 则更新
    arr[a][b] = c;
    arr[b][a] = c;
    cost[a][b] = d;
    cost[b][a] = d;
    }
    if( c == arr[a][b] && d<cost[a][b]){
    cost[a][b] = d;
    cost[b][a] = d;
    }
    }

    int start = s.nextInt()-1;
    int end = s.nextInt()-1;
    if(start == end)
    System.out.println("0 0");
    dij(start,end);
    System.out.println(dist[end]+" "+money[end]);

    for(int i:dist)
    System.out.print(" "+i);
    System.out.println();
    for(int i:money)
    System.out.print(" "+i);
    System.out.println();

    }
    }
    static void dij(int start,int end){
    for(int i=0; i<n; i++){
    dist[i] = arr[start][i]; //初始化dist
    money[i] = cost[start][i];
    }
    int index = start;
    for(int i=0; i<n; i++){ //外层循环,依次找出到各个点的最短距离
    if(i==start)
    continue;
    int min = MAX;
    for(int j=0; j<n; j++)
    if(!isOK[j] && dist[j] < min){ //找到最短路径的顶点
    min = dist[j];
    index = j;
    }
    isOK[index] = true;
    if(isOK[end]) //如果以找到到终点的最短路径,返回
    break;

    for(int k=0; k<n; k++){ //更新 dist[] 和 money[]
    if(k==start)
    continue;
    if( !isOK[k] && arr[index][k] != MAX){
    int temp = arr[index][k]+dist[index];
    int temp2 =cost[index][k] + money[index];
    if(temp < dist[k]){
    dist[k] = temp;
    money[k] = temp2;
    }else if(temp == dist[k] && (money[k] > temp2)){
    money[k] = temp2;
    }

    }
    }


    }
    }

    }


  • 相关阅读:
    jQuery(2)
    jQuery(1)
    underscore.js
    面向对象复习
    1.14函数复习
    面向对象(3)继承
    10.18
    1017
    js笔记二
    js笔记一
  • 原文地址:https://www.cnblogs.com/love533/p/2418314.html
Copyright © 2011-2022 走看看