Pagini recente » Statistici vasilica ion (JustinCK) | Cod sursa (job #2034664) | Monitorul de evaluare | Cod sursa (job #1038714) | Cod sursa (job #1242068)
#include <fstream>
#include <vector>
#include <queue>
#define inf (1<<30)
using namespace std;
ifstream fin ("ubuntzei.in");
ofstream fout ("ubuntzei.out");
vector<pair <int, int> > l[2005];
queue <int> q;
int n,m,k,i,j,sol,K;
int dist [2005][2005],c[2005],di[2005],f[2005],d[20][(1<<15)],x,y,C;
inline int minim (int a, int b) {
return (a<b?a:b);
}
void bfs (int nod) {
int fr,sc,x;
for (int i=1;i<=n;i++) {
f[i]=0;
di[i]=inf;
}
di[c[nod]]=0;
q.push(c[nod]);
while (q.size()) {
x=q.front();
f[x]=0;
for (int i=0;i<l[x].size();i++) {
fr=l[x][i].first,sc=l[x][i].second;
if (di[x]+sc<di[fr]){
di[fr]=di[x]+sc;
if (!f[fr]){
f[fr]=1;
q.push(fr);
}
}
}
q.pop();
}
for (int i=0;i<=k+1;i++)
dist[nod][i]=di[c[i]];
}
int main () {
fin>>n>>m>>k;
c[0]=1;
for (i=1;i<=k;i++)
fin>>c[i];
c[k+1]=n;
for (i=1;i<=m;i++) {
fin>>x>>y>>C;
l[x].push_back(make_pair(y,C));
l[y].push_back(make_pair(x,C));
}
for (i=0;i<=k+1;i++)
bfs(i);
if (k==0) {
fout<<dist[1][k+1]<<"\n";
return 0;
}
K=(1<<(k));
for (i=0;i<=k+1;i++)
for (j=0;j<K;j++)
d[i][j]=inf;
d[0][0]=0;
for (i=0;i<K;i++)
for (j=0;j<=k;j++)
if (d[j][i]!=inf)
for (x=1;x<=k;x++)
if ((i&(1<<(x-1)))==0)
d[x][i|(1<<(x-1))]=minim(d[x][i|(1<<(x-1))],d[j][i]+dist[j][x]);
sol=inf;
for (i=1;i<=k;i++)
sol=minim(sol,d[i][K-1]+dist[i][k+1]);
fout<<sol<<"\n";
return 0;
}