Dijkstra经典入门题目,有关Dijkstra的学习,可以参考下面这篇文章
http://www.cnblogs.com/skywang12345/p/3711512.html
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
#define clear(n,m) memset(n,m,sizeof(n))
using namespace std;
const int MaxInt = 9999999999;
const int MaxNum = 1010;
int map[MaxNum][MaxNum];
int T, S, D, n;
int s[MaxNum];
int d[MaxNum];
int cast[MaxNum];
bool vis[MaxNum];
void Dijkstra()
{
int minn, pos;
clear(vis, false);
vis[0] = true;
for (int i = 0;i <= n;i++)
{
cast[i] = map[0][i];
}
for (int i = 0;i < n;i++)
{
minn = MaxInt;
for (int j = 1;j <= n;j++)
{
if (cast[j] < minn&&!vis[j])
{
pos = j;
minn = cast[j];
}
}
vis[pos] = true;
for (int j = 1;j <= n;j++)
{
if (cast[pos] + map[pos][j] < cast[j] && !vis[j])
cast[j] = cast[pos] + map[pos][j];
}
}
}
int main()
{
while (cin >> T >> S >> D)
{
n = 0;
for (int i = 0;i < 1010;i++)
{
for (int j = 0;j < 1010;j++)
{
map[i][j] = MaxInt;
}
}
for (int i = 0;i < 1010;i++)
{
map[i][i] = 0;
}
for (int i = 0;i < T;i++)
{
int a, b, time;
cin >> a >> b >> time;
n = max(max(n, a), b);
if (time < map[a][b])
map[a][b] = map[b][a] = time;
}
int minn = MaxInt;
for (int i = 0;i < S;i++)
{
cin >> s[i];
map[0][s[i]] = map[s[i]][0] = 0;
}
for (int i = 0;i < D;i++)
{
cin >> d[i];
}
Dijkstra();
for (int i = 0;i < D;i++)
{
minn = min(minn, cast[d[i]]);
}
cout << minn << endl;
}
return 0;
}