Pagini recente » Profil Ramona2007 | Cod sursa (job #1223364) | Istoria paginii runda/testx/clasament | Cod sursa (job #1583944) | Cod sursa (job #1319056)
#include <stdio.h>
#include <algorithm>
#include <vector>
#define mm 250001
#define nm 50001
#define mx 1001
#define mk 16
using namespace std;
struct s{int x,y,c;} G[mk+2];
bool cmp(pair<int,int> a,pair<int,int> b)
{
return a.second<b.second;
}
bool cmp1(s i,s j)
{
return i.c<j.c;
}
int i,j,n,m,x,y,c,K,p,q,ac,C[nm],L[mk],LC[mk+2][nm];
bool a[mk+2],b[mk+2];
vector <pair<int,int> > g[nm];
void dj(int k)
{
int j;
for(j=0;j<g[k].size();j++)
{
if(C[k]+g[k][j].second<C[g[k][j].first])
{
C[g[k][j].first]=C[k]+g[k][j].second;
LC[L[p]][g[k][j].first]=C[g[k][j].first];
}
}
for(j=0;j<g[k].size();j++)
dj(g[k][j].first);
}
void apm()
{
int j=2;bool o;
b[G[1].x]=b[G[1].y]=1; ac=G[1].c;
for(i=2;i<=q;i++)
if(!a[i])
if((b[G[i].x]&&!b[G[i].y])||(b[G[i].y]&&!b[G[i].y]))
{b[G[i].x]=1; b[G[i].y]=1; ac+=G[i].c; a[i]=1;o=1; i=j-1;}
else if(!(o)) {o=1; j=i;}
}
int main()
{
freopen("ubuntzei.in","r",stdin);
freopen("ubuntzei.out","w",stdout);
scanf("%d%d%d",&n,&m,&K);
for(i=1;i<=K;i++) scanf("%d",&L[i]);
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&c);
g[x].push_back(make_pair(y,c));
}
for(i=1;i<=n;i++) stable_sort(g[i].begin(),g[i].begin()+g[i].size(),cmp);
L[0]=1; L[K+1]=n;
for(p=0;p<=K+1;p++) {for(i=1;i<=n;i++) if(i!=L[p]) C[i]=mx; C[L[p]]=0;
dj(L[p]);}
for(i=0;i<=K+1;i++)
for(j=0;j<=K+1;j++)
if(i!=j&&LC[L[i]][L[j]]) {q++; G[q].x=L[i]; G[q].y=L[j]; G[q].c=LC[L[i]][L[j]];}
stable_sort(G,G+K+1,cmp1); apm(); printf("%d",ac);
return 0;
}