Pagini recente » Cod sursa (job #2465727) | Cod sursa (job #3215751) | Cod sursa (job #1249022) | Cod sursa (job #1620921) | Cod sursa (job #1410552)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
const int NMAX=2002;
const int inf=(1<<30);
int dist [NMAX][NMAX], orase[NMAX], di[NMAX], f[NMAX], d[20][(1<<20)], l, u, v, n, m, k, i, j, sol, c;
vector<pair <int, int> > g[NMAX];
queue <int> q;
void dijkstra(int nod)
{
for(int i=1; i<=n; i++)
{
f[i]=0;
di[i]=inf;
}
di[orase[nod]]=0;
q.push(orase[nod]);
while(!q.empty())
{
int vic=q.front();
f[vic]=0;
for(int i=0; i<g[vic].size(); i++)
{
if(di[vic]+g[vic][i].second<di[g[vic][i].first])
{
di[g[vic][i].first]=di[vic]+g[vic][i].second;
if(!f[g[vic][i].first])
{
f[g[vic][i].first]=1;
q.push(g[vic][i].first);
}
}
}
q.pop();
}
for(int i=0; i<=k+1; i++)
dist[nod][i]=di[orase[i]];
}
int main()
{
ifstream cin ("ubuntzei.in");
ofstream cout ("ubuntzei.out");
cin>>n>>m>>k;
orase[0]=1;
for (i=1; i<=k; i++)
cin>>orase[i];
orase[k+1]=n;
for (i=1; i<=m; i++)
{
cin>>u>>v>>c;
g[u].push_back(make_pair(v,c));
g[v].push_back(make_pair(u,c));
}
for (i=0; i<=k+1; i++)
dijkstra(i);
if (k==0)
{
cout<<dist[0][1]<<"\n";
return 0;
}
u=(1<<(k));
for (i=0; i<=k+1; i++)
for (j=0; j<u; j++)
d[i][j]=inf;
d[0][0]=0;
for(i=0; i<u; i++)
for(j=0; j<=k; j++)
if(d[j][i]!=inf)
for(l=1; l<=k; l++)
if((i&(1<<(l-1)))==0)
d[l][i|(1<<(l-1))]=min(d[l][i|(1<<(l-1))],d[j][i]+dist[j][l]);
sol=inf;
for(i=1; i<=k; i++)
sol=min(sol,d[i][u-1]+dist[i][k+1]);
cout<<sol<<"\n";
return 0;
}