Pagini recente » Cod sursa (job #2742601) | Cod sursa (job #2965563) | Cod sursa (job #2516044) | Cod sursa (job #2914636) | Cod sursa (job #1837635)
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
int n, m;
vector<pair<int, int> > vecini[2005];
int viz[2005];
int muchiiObligatorii[20];
int k;
void citire()
{
scanf("%d %d", &n, &m);
scanf("%d", &k);
for(int i = 0; i < k; i++)
{
scanf("%d", &muchiiObligatorii[i]);
muchiiObligatorii[i]--;
}
int tmp1, tmp2, tmp3;
for(int i = 0; i < m; i++)
{
scanf("%d %d %d", &tmp1, &tmp2, &tmp3);
tmp1--;
tmp2--;
vecini[tmp1].push_back(make_pair(tmp3, tmp2));
vecini[tmp2].push_back(make_pair(tmp3, tmp1));
}
for(int i = 0; i < n; i++)
{
viz[i] = -1;
}
}
//void solve1()
//{
// priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > Q;
// Q.push(make_pair(0, 0));
//
// while(!Q.empty())
// {
// int dest = Q.top().second;
// int cost = Q.top().first;
// Q.pop();
//
// if(viz[dest] == -1 || viz[dest] > cost)
// {
// viz[dest] = cost;
//
// int l = vecini[dest].size();
//
// for(int i = 0; i < l; i++)
// {
// Q.push(make_pair(cost + vecini[dest][i].first, vecini[dest][i].second));
// }
// }
// }
//
// printf("%d", viz[n - 1]);
//}
int dist(int x, int y)
{
for(int i = 0; i < n; i++)
{
viz[i] = -1;
}
priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > Q;
Q.push(make_pair(0, x));
while(!Q.empty())
{
int dest = Q.top().second;
int cost = Q.top().first;
Q.pop();
if(viz[dest] == -1 || viz[dest] > cost)
{
viz[dest] = cost;
int l = vecini[dest].size();
for(int i = 0; i < l; i++)
{
Q.push(make_pair(cost + vecini[dest][i].first, vecini[dest][i].second));
}
}
}
return viz[y];
}
int solve()
{
if(k == 1)
{
return dist(0, muchiiObligatorii[0]) + dist(muchiiObligatorii[0], n - 1);
}
else
{
return dist(0, n - 1);
}
}
int main()
{
freopen("ubuntzei.in", "r", stdin);
freopen("ubuntzei.out", "w", stdout);
citire();
if(k == 0)
{
printf("%d", dist(0, n - 1));
}
else
{
printf("%d", solve());
}
return 0;
}