HDOJ--2680--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): 10372    Accepted Submission(s): 3342

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

题意:琪琪想要去拜访她的朋友,但是这货容易晕车,所以要找一个花费时间最少的路线。现在给你路线图,让你找出从她家附近的起点站(可以有多个)到朋友家附近的终点站(只有一个)花费时间最少的路线。各个站点的编号从1到n。

思路:最开始我是直接无脑用DIJ算法做的结果丝毫不意外(TLE)了,FUCK。看了看别人的思路才造应该把终点当起点反向构图,注意,这是个单向图。

AC代码:

#include<stdio.h>
#include<string.h>
#define INF 0x3f3f3f3f
#include<algorithm>
using namespace std;
int vis[1010],map[1010][1010],dis[1010],n,ans[1010],num,beg;
void init(){
	for(int i=1;i<=n;i++)
		for(int j=0;j<=n;j++){
			if(i==j)
				map[i][j]=map[j][i]=0;
			else
				map[i][j]=map[j][i]=INF;
		}
}
void dijkstra(){
	int k=0,flag=0,i;
		memset(vis,0,sizeof(vis));
		for(i=1;i<=n;i++)
			dis[i]=map[beg][i];
		vis[beg]=1;
		for(i=1;i<=n;i++){
			int j,key,temp=INF;
			for(int j=1;j<=n;j++)
				if(!vis[j]&&temp>dis[j])
					temp=dis[key=j];
			if(temp==INF){
				break;
			}
			vis[key]=1;
			for(int j=1;j<=n;j++)
				if(!vis[j]&&dis[j]>dis[key]+map[key][j])
					dis[j]=dis[key]+map[key][j];
		}
}
int main(){
	int m;
	while(scanf("%d%d%d",&n,&m,&beg)!=EOF){
		int i;
		memset(ans,INF,sizeof(INF));
		init();//注意要初始化。
		for(i=1;i<=m;i++){
			int a,b,cost;
			scanf("%d%d%d",&a,&b,&cost);
			if(map[b][a]>cost)//过滤掉相同的边。反向构图。
				map[b][a]=cost;
		}
		scanf("%d",&num);
		dijkstra();//直接找到各个终点的位置。
		for(i=0;i<num;i++){
			int end;
			scanf("%d",&end);
			ans[i]=dis[end];
		}
		sort(ans,ans+num);
		if(ans[0]==INF)//判断是否存在这样的值,不存在的话ans数组肯定每一个都是INF。
			printf("-1\n");
		else
			printf("%d\n",ans[0]);
	}
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-25 14:07:41

HDOJ--2680--Choose the best route的相关文章

hdu 2680 Choose the best route 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2680 题目意思:实质就是给定一个多源点到单一终点的最短路. 卑鄙题---有向图.初始化map时 千万不要写成 map[i][j] = map[j][i] = X. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 using namespac

HDU 2680 Choose the best route(最短路)

Choose the best route Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 2680 Description One day , Kiki wants to visit one of her friends. As she is liable to carsickness , she wants to arrive at

hdu 2680 Choose the best route 大年三十的首A 赤裸裸的Dijkstra 做这题需要一个小技巧

Choose the best route Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 8063    Accepted Submission(s): 2655 Problem Description One day , Kiki wants to visit one of her friends. As she is liable

HDU 2680 Choose the best route(dijkstra+优先队列优化)

Choose the best route 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 stati

HDU - 2680 - Choose the best route (经典最短路问题dijkstra算法!!)

Choose the best route Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7671    Accepted Submission(s): 2524 Problem Description One day , Kiki wants to visit one of her friends. As she is liable

hdu 2680 Choose the best route (Dijkstra &amp; 反向图)

Choose the best route Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7764    Accepted Submission(s): 2581 Problem Description One day , Kiki wants to visit one of her friends. As she is liable

HDU 2680 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): 7361    Accepted Submission(s): 2408 Problem Description One day , Kiki wants to visit one of her friends. As she is liable

HDU 2680 Choose the best route &lt;SPFA算法+反向建图&gt;

Choose the best route Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 10690    Accepted Submission(s): 3454 Problem Description One day , Kiki wants to visit one of her friends. As she is liabl

hdu 2680 Choose the best route

BFS..... #include<stdio.h> #include<math.h> #include<string.h> #include<vector> #include<algorithm> using namespace std; const int maxn = 1111; vector<int>abc[maxn]; int ji[maxn], tt[maxn][maxn], yy[maxn]; struct aaa{ i

hdu 2680 Choose the best route (SPFA算法)

本题链接:点击打开链接 本题大意: 输入n,m,s,代表有n个点,m条边,s代表终点.然后输入边,每条边输入p,q,t:p,q代表两个点,t表示边权,注意题目中说是从p指向q边,故应建立有向图.然后输入w表示有w个起点,然后输入起点:对于多个起点,如果对每个起点使用一次SPFA,则起点多的话可能会有点麻烦,所以不妨这样进行处理:另外设置一个不与题目中重合的点,将所有起点到此点的边权设为0,然后以此点为起点进行查找所找到的必然是最短的.具体请参考代码: #include<stdio.h> #in