hdu3790最短路径问题 (Dijkstra算法)
生活随笔
收集整理的這篇文章主要介紹了
hdu3790最短路径问题 (Dijkstra算法)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
最短路徑問(wèn)題
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 32544 Accepted Submission(s): 9565Problem Description給你n個(gè)點(diǎn),m條無(wú)向邊,每條邊都有長(zhǎng)度d和花費(fèi)p,給你起點(diǎn)s終點(diǎn)t,要求輸出起點(diǎn)到終點(diǎn)的最短距離及其花費(fèi),如果最短距離有多條路線,則輸出花費(fèi)最少的。Input輸入n,m,點(diǎn)的編號(hào)是1~n,然后是m行,每行4個(gè)數(shù) a,b,d,p,表示a和b之間有一條邊,且其長(zhǎng)度為d,花費(fèi)為p。最后一行是兩個(gè)數(shù) s,t;起點(diǎn)s,終點(diǎn)。n和m為0時(shí)輸入結(jié)束。
(1<n<=1000, 0<m<100000, s != t)Output輸出 一行有兩個(gè)數(shù), 最短距離及其花費(fèi)。Sample Input3 2
1 2 5 6
2 3 4 5
1 3
0 0Sample Output9 11
初始化操作:初始化map與cost,注意如果a=b時(shí)候?yàn)轫旤c(diǎn)到自身,因此初始化為0,其他為INF方便后面求解 輸入操作:在輸入的時(shí)候不僅存儲(chǔ)map與cost也要選出a、b之間路徑最短與花費(fèi)最低的值,因?yàn)榭梢暂斎霐?shù)據(jù)有a、b有多條路徑直接相連接。 進(jìn)入Dijkstra方法內(nèi)變量與數(shù)組的定義:定義要用到的訪問(wèn)數(shù)組vis[]、存兩點(diǎn)直接最短路徑的數(shù)組d[]、存兩點(diǎn)之間最小花費(fèi)的數(shù)組c[]、要用到的常量Min做比較操作。 初始化最短路徑數(shù)組d[]、存兩點(diǎn)之間最小花費(fèi)的數(shù)組c[],遍歷map與cost求start起始點(diǎn)到end終止點(diǎn)的值,初始化完成后標(biāo)記第一個(gè)start頂點(diǎn)已經(jīng)訪問(wèn)過(guò)。 第一次遍歷n個(gè)頂點(diǎn),如果end終點(diǎn)
package com.test;import java.util.Scanner;public class Main {static int maxn = 1007;static int INF = 65535;static int start, e;static int n, m;static int[][] map = new int[maxn][maxn];static int[][] cost = new int[maxn][maxn];public static void main(String[] args) {Scanner sc = new Scanner(System.in);while (sc.hasNext()) {n = sc.nextInt();m = sc.nextInt();for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {map[i][j] = i == j ? 0 : INF;cost[i][j] = i == j ? 0 : INF;}}int a, b, c, d;for (int i = 1; i <= m; i++) {a = sc.nextInt();b = sc.nextInt();c = sc.nextInt();d = sc.nextInt();if (map[a][b] > c) {map[a][b] = map[b][a] = c;cost[a][b] = cost[b][a] = d;} else if (map[a][b] == c) {if (cost[a][b] > d)cost[a][b] = cost[b][a] = d;}}start=sc.nextInt();e=sc.nextInt();Dijkstra();}}private static void Dijkstra() {int v = 0,Min;int[] vis = new int[maxn];int[] d = new int[maxn];int[] c = new int[maxn];for(int i = 1;i <= n;i++) {d[i] = map[start][i];c[i] = cost[start][i];}vis[start]=1;//標(biāo)記訪問(wèn)過(guò)for(int i=1;i<=n;i++){
// if(vis[e]==1){//終點(diǎn)已經(jīng)遍歷了直接跳出循環(huán)
// break;
// }Min=INF;for(int j=1;j<=n;j++){//如果該頂點(diǎn)沒(méi)有訪問(wèn)過(guò)并且if(vis[j]==0&&d[j]<Min){v=j;Min=d[j];}}vis[v]=1;//標(biāo)記訪問(wèn)for(int j=1;j<=n;j++){//map[v][j]表示v到j(luò)的路徑長(zhǎng)度if(vis[j]==0&&map[v][j]<INF){if(d[j]>d[v]+map[v][j]){d[j]=d[v]+map[v][j];c[j]=c[v]+cost[v][j];}else if(d[j]==d[v]+map[v][j]){if(c[j]>c[v]+cost[v][j]){c[j]=c[v]+cost[v][j];}}}}}System.out.println(d[e]+" "+c[e]);}
}
解題步驟:
注意:map[a][b],cost[a][b]分別表示ab的路徑長(zhǎng)度與花費(fèi)
總結(jié)
以上是生活随笔為你收集整理的hdu3790最短路径问题 (Dijkstra算法)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Unity3d(UE4)动态加载osgb
- 下一篇: USB Flash Drives