HDU:Choose the best route

Choose the best route

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 23881 Accepted Submission(s): 7634

Problem Description

One day , Kiki wants to visit one of her friends. As she is liable to carsickness , she wants to arrive at her friend’s home as soon as possible . Now give you a map of the city’s traffic route, and the stations which are near Kiki’s home so that she can take. You may suppose Kiki can change the bus at any station. Please find out the least time Kiki needs to spend. To make it easy, if the city have n bus stations ,the stations will been expressed as an integer 1,2,3…n.

Input

There are several test cases.
Each case begins with three integers n, m and s,(n<1000,m<20000,1=<s<=n) n stands for the number of bus stations in this city and m stands for the number of directed ways between bus stations .(Maybe there are several ways between two bus stations .) s stands for the bus station that near Kiki’s friend’s home.
Then follow m lines ,each line contains three integers p , q , t (0<t<=1000). means from station p to station q there is a way and it will costs t minutes .
Then a line with an integer w(0<w<n), means the number of stations Kiki can take at the beginning. Then follows w integers stands for these stations.

Output

The output contains one line for each data set : the least time Kiki needs to spend ,if it’s impossible to find such a route ,just output “-1”.

Sample Input

5 8 5
1 2 2
1 5 3
1 3 4
2 4 7
2 5 6
2 3 5
3 5 1
4 5 1
2
2 3
4 3 4
1 2 3
1 3 4
2 3 2
1
1

Sample Output

1
-1

題目大意

給定多個起點,和一個終點,求由起點到終點的最短路徑。但是需要注意的是題目給定邊的信息時可能存在一條邊重複存在的數據,因此對於同一條邊,需要取最小值。

解題思路

反向建圖,既可以轉換爲一個起點到多個終點的形式,也就是普通的 Dijstra 最短路徑問題了。

解題代碼

#include <cstdio>
#include <string.h>
#include <stdlib.h>
#include <cmath>
#include <iostream>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
using namespace std;
const int MAXN = 1005;
const int INF = 1e9;
int n, m, s, w;
int edges[MAXN][MAXN], w_arr[MAXN], dist[MAXN];
bool visit[MAXN];

void dijstra(){
	// 初始化dist
	for(int i = 1; i <= n; i++){
		dist[i] = edges[s][i];
		visit[i] = false;
	} 
	visit[s] = true;
	dist[s] = 0;
	for(int i = 1; i < n; i++){
		int min_dist = INF, next;
		// 選擇離出發點最近的點
		for(int j = 1; j <= n; j++){
			if(!visit[j] && dist[j] < min_dist){
				min_dist = dist[j];
				next = j;
			}
		}
		if(min_dist == INF)    continue;
		visit[next] = true;
		// 以選中的點爲跳板進行更新
		for(int j = 1; j <= n; j++){
			if(!visit[j]){
				dist[j] = min(dist[next] + edges[next][j], dist[j]);
			}
		} 
	}
}


int main(){
	while(~scanf("%d %d %d", &n, &m, &s)){
		for(int i = 1; i <= n; i++){
			for(int j = 1; j <= n; j++){
				edges[i][j] = i == j ? 0 : INF;
			}
		}
		int p, q, t;
		while(m--){
			scanf("%d %d %d", &p, &q, &t);
			edges[q][p] = min(t, edges[q][p]);
		}
		scanf("%d", &w);
		for(int i = 0; i < w; i++)    scanf("%d", &w_arr[i]);
		dijstra();
		int ans = INF;
		for(int i = 0; i < w; i++){
			ans = min(ans, dist[w_arr[i]]);
		}
		printf("%d\n", ans >= INF ? -1 : ans);
		
	}
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章