http://acm.hdu.edu.cn/showproblem.php?pid=2066
分析:
题目要求输出草儿想去的城市的最短时间,就是 家->A(相邻城市)->B(几个中的任意一个) 的最短距离。
由于最终是从一个出发点到一个终点,仔细分析,不难得出这是个单源最短路问题(就是一个出发点,一个终点)。
所以可以运用dijkstra。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#define maxx 999999999
using namespace std;
int t, s, d, n,u;
int map[1005][1005];
int star[1005];
int terminal[1005];
int _distance[1005];
int vis[1005];
void djstl()
{
memset(vis, 0, sizeof(vis));
for (int i = 0;i <= n;++i)
{
_distance[i] = map[0][i];
//此处代表所有点到0点的距离;用 _distance[i]表示
}
vis[0] = 1;
//标记0点已经走过-------------------------------------
for (int i = 1;i <= n - 1;++i)
{
int mins = maxx;
for (int j = 1;j <= n;++j)
{
if (!vis[j] && mins > _distance[j])
{
mins = _distance[j];
u = j;
}
}
if (vis[u])
continue;
//没有检验到离i最近的点,直接进入下一个循环.(注意u定义的位置)
vis[u] = 1;
for (int j = 1;j <= n;++j)
{
if (map[u][j] != maxx)
if (map[u][j] + _distance[u] < _distance[j])
_distance[j] = _distance[u] + map[u][j];
//松弛操作,到达u的距离+从u到达j的距离,比已有的线路到达j,更短,则更新
}
}
}
int main()
{
while (scanf("%d%d%d", &t, &s, &d) == 3)
{
for (int i = 0;i < 1005;++i)
{
for (int j = 0;j < 1005;++j)
map[i][j] = maxx;
map[i][i] = 0;
}
//用邻接矩阵保存无向图--------------------------------------
int a, b, tim;
n = 0;
for (int i = 0;i < t;++i)
{
scanf("%d%d%d", &a, &b, &tim);
map[a][b] = map[b][a] = map[a][b]>tim ? tim : map[a][b];
//保存两个城市之间的最短路径-----------------------------
n = max(max(a, n), b);
//保存最多能有几个城市(节约时间)-------------------------
}
for (int i = 0;i < s;++i)
{
scanf("%d", &star[i]);
map[0][star[i]] = map[star[i]][0] = 0;
//相当于有多个起点---------------------------------------
}
djstl();
int mins = maxx;
for (int i = 0;i < d;++i)
{
scanf("%d", &terminal[i]);
if (_distance[terminal[i]] < mins)
mins = _distance[terminal[i]];
//找出最短距离即可---------------------------------------
}
cout << mins << endl;
}
}