Pagini recente » Cod sursa (job #561996) | Cod sursa (job #2650765) | Cod sursa (job #2819561) | Cod sursa (job #670834) | Cod sursa (job #2127057)
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
#include <cstdio>
#define inf 0x3f3f3f3f
#define min(a, b) a<b?a:b
#define N 2005
using namespace std;
vector <pair <int, int> > g[N];
vector <pair <int, int> >::iterator it;
int n, m, k, o[N], d[15][1<<15], c[N], cost[N][N];
void citire()
{
scanf("%d %d\n", &n, &m);
scanf("%d ", &k);
for(int i=0;i<k;i++)
scanf("%d ", &o[i]);
o[k++]=n;
for(int i=0;i<m;i++)
{
int x, y, cc;
scanf("%d %d %d\n", &x, &y, &cc);
g[x].push_back(make_pair(y, cc));
g[y].push_back(make_pair(x, cc));
cost[x][y]=cc;
cost[y][x]=cc;
}
}
void dfs(int drum)
{
for(int nod=0;nod<k;nod++)
if(drum&(1<<nod))
for(int it=0;it<k;it++)
if(drum^(1<<it)==0)
d[nod][drum]=min(d[nod][drum], d[it][drum^(1<<nod)] + cost[it][o[it]]);
}
void bellman(int x)
{
memset(c, inf, sizeof(c));
queue <int> q;
c[x]=0;
q.push(1);
while(!q.empty())
{
int v=q.front();
q.pop();
for(it=g[v].begin();it!=g[v].end();it++)
{
if(c[v]+it->second<c[it->first])
{
c[it->first]=c[v]+it->second;
q.push(it->first);
}
}
}
}
int main()
{
freopen("ubuntzei.in", "r", stdin);
// freopen("ubuntzei.out", "w", stdout);
citire();
for(int i=0;i<k;i++)
{
bellman(o[i]);
for(int j=0;j<=n;j++)
cost[i][j]=c[j];
}
for(int i=0;i<k;i++)
d[1<<i][i]=cost[i][1];
memset(d, inf, sizeof(d));
d[0][1]=0;
for(int i=1;i<=(1<<k);i++)
dfs(i);
printf("%d", d[k-1][(1<<k)-1]);
return 0;
}