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 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

尽管条件很艰苦,尽管今天是大年三十,我还是在努力。

这题如果直接Dijkstra的话,多次求单源最短路径,会超时,但是我只要设置一个超级源点0,0到各个起点的距离为0,到其他各点距离为INF。就完美解决了!是不是很巧妙

另外该图是无向图。自己到自己也是INF

下面是代码:

#include <stdio.h>
#include <string.h>
#define MAX 1010
#define INF 100000000
int dis[MAX] , graph[MAX][MAX] ;
bool closed[MAX] ;
void dijkstra(int u , int n)
{
	for(int i = 1 ; i <= n ; ++i)
	{
		dis[i] = graph[u][i] ;
		closed[i] = false ;
	}
	closed[u] = true ;
	for(int i = 1 ; i <= n ; ++i)
	{
		int min = INF , index = 0 ;
		for(int j = 1 ; j <= n ; ++j)
		{
			if(!closed[j] && dis[j]<min)
			{
				min = dis[j];
				index = j ;
			}
		}
		if(min == INF)
		{
			break ;
		}
		closed[index] = true ;
		for(int j = 1 ; j <= n ; ++j)
		{
			if(graph[index][j] == INF)
			{
				continue ;
			}
			if(dis[j]>dis[index] + graph[index][j])
			{
				dis[j] = dis[index] + graph[index][j] ;
			}
		}
	}
}

int main()
{
	int n , m ,s;
	while(~scanf("%d%d%d",&n,&m,&s))
	{
		for(int i = 0 ; i <= n ; ++i)
		{
			for(int j = 0 ; j <= i ; ++j)
			{
				graph[i][j] = graph[j][i] = INF ;
			}
		}
		for(int i = 0 ; i < m ; ++i)
		{
			int x,y,w;
			scanf("%d%d%d",&x,&y,&w);
			if(graph[x][y] > w)
			{
				graph[x][y] = w ;
			}
		}

		int ans = INF , q ;
		scanf("%d",&q) ;
		for(int i = 0 ; i < q ; ++i)
		{
			int u ;
			scanf("%d",&u);
			graph[0][u] = 0;
		}
		dijkstra(0,n) ;
		ans = ans<dis[s]?ans:dis[s] ;
		if(ans == INF)
		{
			puts("-1") ;
		}
		else
		{
			printf("%d\n",ans) ;
		}
	}
	return 0 ;
}

与君共勉

有志者,事竟成。破釜沉舟,百二秦关终属楚。

苦心人,天不负。卧薪尝胆,三千越甲可吞吴。

时间: 2024-10-20 17:03:33

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

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(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