Pagini recente » Cod sursa (job #1753446) | Cod sursa (job #1550880)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
#define INF 0x3f3f3f3f
#define NMAX 2005
vector<pair<int, int> > v[NMAX];
bool used[NMAX];
int dp[16][(1<<16)];
int c[17];
int d[17][NMAX];
queue<int > Q;
int main()
{
int n,m,k,x,y,cost;
fin>>n>>m;
fin>>k;
k++;
for(int i = 0; i < k; i++)
{
if(i < k-1)
fin>>c[i];
else c[i] = n;
for(int j = 1; j <= n; j++)
d[i][j] = INF;
}
for(int i = 1; i <= m; i++)
{
fin>>x>>y>>cost;
v[x].push_back(make_pair(y,cost));
v[y].push_back(make_pair(x,cost));
}
for(int ci = 0; ci < k; ci++)
{
Q.push(c[ci]);
d[ci][c[ci]] = 0;
while(!Q.empty())
{
x = Q.front();
//int di = p.second;
Q.pop();
for(vector<pair<int, int> >::iterator it = v[x].begin(); it != v[x].end(); it++)
{
if(d[ci][x] + it->second < d[ci][it->first])
{
d[ci][it->first] = d[ci][x] + it->second;
Q.push(it->first);
}
}
}
}
for(int i = 0; i < k; i++)
{
for(int j = 1; j <= (1<<k); j++)
dp[i][j] = INF;
}
for(int i = 0; i < k; i++)
{
dp[i][(1<<i)]=d[i][1];
}
for(int nr = 1; nr <= (1<<k); nr++)
{
for(int i = 0; i < k; i++)
{
if(!((1<<i) & nr) || nr == (1<<i))
continue;
for(int j = 0; j < k; j++)
if(((1<<j) & nr) && i != j)
{
dp[i][nr] = min(dp[i][nr], dp[j][nr-(1<<i)] + d[j][c[i]]);
}
}
}
fout<<dp[k-1][(1<<k)-1]<<' ';
//fout<<dp[0][1];
return 0;
}