Pagini recente » Cod sursa (job #630927) | Cod sursa (job #1256920) | Cod sursa (job #1132524) | Cod sursa (job #1332409) | Cod sursa (job #3033350)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#define inf 2147483647
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int a[2001][2001];
int distante[2001];
int m, n, k;
int vk[2001];
int viz[2001];
int a1, a2, a3;
int dmin, poz, curr, pozcurr;
void citire()
{
fin >> n >> m >> k;
for(int i = 1 ; i <= k; i++)
fin >> vk[i];
for(int i = 1 ; i <= m; i++)
{
fin >> a1 >> a2 >> a3;
a[a1][a2] = a3;
a[a2][a1] = a3;
}
}
void setare(int start)
{
for(int i = 1 ; i <= n; i++)
distante[i] = inf;
for(int i = 1 ; i <= n; i++)
{
if(a[start][i] != 0)
distante[i] = a[start][i];
}
distante[start] = 0;
}
void drum(int start)
{
setare(start);
bool ok = true;
while(ok)
{
ok = false;
for(int i = 1; i <= n; i++)
{
for(int j = 1 ; j <= n; j++)
if(distante[i] + a[i][j] < distante[j] && a[i][j])
{
distante[j] = distante[i] + a[i][j];
ok = true;
}
}
}
}
int rezolvare()
{
poz = 1;
for(int j = 1 ; j <= k; j++)
{
drum(poz);
curr = inf;
for(int i = 1 ; i <= k; i++)
{
if(curr > distante[vk[i]] && vk[i] != poz && vk[i])
{
curr = distante[i];
pozcurr = i;
}
}
poz = pozcurr;
vk[poz] = 0;
dmin += curr;
}
drum(poz);
dmin += distante[n];
return dmin + 1;
}
int main()
{
citire();
fout << rezolvare();
return 0;
}