Pagini recente » Cod sursa (job #2271893) | Cod sursa (job #665367) | Cod sursa (job #2766475) | Cod sursa (job #1627463) | Cod sursa (job #1333687)
#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>
#define INF 1<<25
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
const int LIM=2005;
queue <int> q;
vector < pair <int,int> > lista[LIM];
int n,m,k,c[20],dist[LIM],w[20][20], dp[1<<17][17];
void Bellman_Ford(int nod)
{
int tata, fiu;
for(int i=0;i<=n;++i) dist[i]=INF;
q.push(nod);
dist[nod] = 0;
while(!q.empty())
{
tata = q.front();
q.pop();
for(int i=0; i<lista[tata].size(); i++)
{
fiu = lista[tata][i].first;
if(dist[fiu] > dist[tata] + lista[tata][i].second)
{
//vtata[fiu] = tata; rol pedagogic
dist[fiu] = dist[tata] + lista[tata][i].second;
q.push(fiu);
}
}
}
}
int Hamilton()
{
int i, j;
for(i=0; i<(1<<17); ++i)
for(j=0; j<=16; ++j)
dp[i][j] = INF;
dp[1][0] = 0;
k+=2; //consideram si destinatia
for(i=2; i<(1<<k); ++i)
for(j=1; j<k; ++j)
if(i&(1<<j))
for(int v=0; v<k; v++)
dp[i][j]=min(dp[i][j], dp[i^(1<<j)][v] + w[v][j]);
return dp[(1<<k) - 1][k-1];
}
int main()
{
fin>>n>>m>>k;
for(int i=1;i<=k;++i)
fin>>c[i];
for(int i=1;i<=m;++i)
{
int x,y,cost;
fin>>x>>y>>cost;
lista[x].push_back(make_pair(y,cost));
lista[y].push_back(make_pair(x,cost));
}
c[0]=1;
c[k+1]=n;
for(int i=0;i<=k;++i)
{
Bellman_Ford(c[i]);
for(int j=0;j<=k+1;++j)
w[i][j]=w[j][i]=dist[c[j]];
}
fout<<Hamilton();
return 0;
}