题目描述
某一天,有一个叫qq的小xx,想找到她丢失已久的朋友。然而,她比较懒,只想尽快找到。现在有一张公交线路图,以及她家附近的公交站,并且已知丢失的朋友在哪。她可以在任何站换乘公交。这些公交站从1到n编号。
输入格式
每种情况均以三个整数n,m和t开头,(n <1000,m <20000, 1 =< t <= n)n代表该城市的公交车站数量,m代表之间的有向车道数量公交车站。(也许在两个公交车站之间有几种方式。)t代表在丢失的朋友附近的公交车站。然后跟随m行,每行包含三个整数p,q,d(0 <d <= 1000)。意思是从车站p到车站q有一种办法,它将花费d分钟(注意只能单向通行)。
然后,一行具有整数s(0 <s <n)的行表示Kiki可以在开始时使用的站点数。然后,s个整数代表这些站。
输出格式
输出每个数据集包含一行:qq需要花费的最少时间,如果无法找到,只需输出“ -1”即可。
样例输入
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
样例输出
1 -1
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
const int N = 1005,INF = 0x3f3f3f3f;
int g[N][N], dist[N];
bool st[N];
int n, m, s;
void dijkstra()
{
memset(dist, INF, sizeof dist);
memset(st, false, sizeof st);
for (int i = 1; i <= n; i++) dist[i] = g[0][i];
for (int i = 1; i <= n; i++)
{
int t = -1,mi = INF;
for (int j = 1; j <= n; j++)
if (!st[j] && (t == -1 || dist[t] > dist[j]))
t = j;
st[t] = true;
for (int j = 1; j <= n; j++) dist[j] = min(dist[j], dist[t] + g[t][j]);
}
}
int main()
{
ios::sync_with_stdio(false);
while (cin >> n >> m >> s)
{
memset(g, INF, sizeof g);
for (int i = 1; i <= m; i++)
{
int z, x, c;
scanf_s("%d%d%d", &z, &x, &c);
g[z][x] = min(g[z][x],c);
}
int w;
cin >> w;
//当有多个起点时,则设0号位置为总起点,0号位置到各个给定的起点的距离均为0
for (int i = 0; i < w; i++)
{
int num;
cin >> num;
g[0][num] = 0;
}
dijkstra();
if (dist[s] != INF) cout << dist[s] << endl;
else cout << -1 << endl;
}
}