Pagini recente » Cod sursa (job #2551377) | Cod sursa (job #2188989) | Cod sursa (job #616133) | Cod sursa (job #999633) | Cod sursa (job #2165041)
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
const int nmax=2000, inf=1000000000;
typedef pair<int,int> ii;
vector<ii> g[nmax+3];
int prieteni[17];
int main()
{
freopen("ubuntzei.in","r",stdin);
freopen("ubuntzei.out","w",stdout);
int n,m,k,lmin=0;
scanf("%d%d%d",&n,&m,&k);
int i,j;
for(i=1;i<=k;i++)
{
scanf("%d",&prieteni[i]);
}
int x, y, z;
ii aux;
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
aux.first=z;
aux.second=y;
g[x].push_back(aux);
aux.second=x;
g[y].push_back(aux);
}
vector<int> dist(n+1,inf);
int start=1,distmin,prmin=k+1;
priority_queue<ii, vector<ii>, greater<ii> > pq;
ii asdf;
for(i=1;i<=k;i++)
{
//aflam distanta pana la fiecare prieten
dist[start]=0;
pq.push(ii(0,start));
while(!pq.empty())
{
asdf=pq.top();
pq.pop();
int d=asdf.first, u=asdf.second;
if(d>dist[u])
continue;
for(j=0;j<(int)g[u].size();j++)
{
int duv=g[u][j].first, v=g[u][j].second;
if(dist[u]+duv<dist[v])
{
dist[v]=dist[u]+duv;
pq.push(ii(dist[v],v));
}
}
}
//vedem cel mai apropiat prieten si adunam distanta
distmin=inf;
for(j=1;j<=k;j++)
{
if(prieteni[j]==-1)
continue;
if(dist[prieteni[j]]<distmin)
{
distmin=dist[prieteni[j]];
prmin=j;
}
}
lmin+=distmin;
//continuam cu acela
start=prieteni[prmin];
prieteni[prmin]=-1;
for(j=0;j<=n;j++)
{
dist[j]=inf;
}
}
dist[start]=0;
pq.push(ii(0,start));
while(!pq.empty())
{
asdf=pq.top();
pq.pop();
int d=asdf.first, u=asdf.second;
if(d>dist[u])
continue;
for(j=0;j<(int)g[u].size();j++)
{
int duv=g[u][j].first, v=g[u][j].second;
if(dist[u]+duv<dist[v])
{
dist[v]=dist[u]+duv;
pq.push(ii(dist[v],v));
}
}
}
lmin+=dist[n];
printf("%d",lmin);
return 0;
}