Pagini recente » Cod sursa (job #2899314) | Cod sursa (job #128086) | Cod sursa (job #2950462) | Cod sursa (job #7299) | Cod sursa (job #2255472)
#include <bits/stdc++.h>
using namespace std;
const int nmax=2005;
struct lista
{
int v,cost;
};
struct coada
{
int nod,cost;
bool operator < (const coada &x) const
{
return cost > x.cost;
}
};
int m, n, k;
int cost[nmax][nmax],dp[35000][20];
vector<lista>l[nmax];
priority_queue<coada>pq;
int sol[nmax];
int s[nmax];
void dijkstra(int nod)
{
for(int i = 1 ; i <= n ; i ++)
sol[i] = INT_MAX;
coada temp;
temp.nod = nod;
temp.cost = 0;
pq.push(temp);
while(!pq.empty())
{
temp = pq.top();
int val = temp.nod;
int cst = temp.cost;
pq.pop();
if(sol[val] != INT_MAX)
continue;
sol[temp.nod] = cst;
for(vector<lista>::iterator it = l[val].begin() ; it != l[val].end() ; it++)
{
lista temp1 = *it;
coada aux;
aux.nod = temp1.v;
aux.cost = temp1.cost + cst;
pq.push(aux);
}
}
for(int i = 1 ; i <= n ; i++)
{
if(sol[i] == nod)
continue;
if(sol[i] == INT_MAX)
cost[i][nod] = cost[nod][i] = 0;
else
cost[i][nod] = cost[nod][i] = sol[i];
}
}
void dinamica()
{
for(int i = 1 ; i <= k ; i++)
dp[1<<(i-1)][i] = cost[1][s[i]];
int ns = 1<<k;
for(int xz = 0 ; xz < ns ; xz++)
{
for(int i = 1 ; i <= k ; i++)
if(xz & (1<<(i-1)) && xz != (1<<(i-1)))
{
dp[xz][i] = INT_MAX;
for(int j = 1 ; j <= k ; j++)
{
if(i != j && xz & (1 << (j-1)))
dp[xz][i] = min(dp[xz][i],dp[xz-(1<<(i-1))][j]+cost[s[j]][s[i]]);
}
}
}
}
int main()
{
ifstream cin("ubuntzei.in");
ofstream cout("ubuntzei.out");
int u, v, c;
cin>>n>>m>>k;
for(int i = 1 ; i <= k ; i++)
cin>>s[i];
s[0] = 1;
s[++k] = n;
for(int i = 1 ; i <= m ; i++)
{
cin>>u>>v>>c;
lista temp;
temp.cost = c;
temp.v = v;
l[u].push_back(temp);
temp.cost = c;
temp.v = u;
l[v].push_back(temp);
}
for(int i = 0 ; i <= k ; i++)
dijkstra(s[i]);
dinamica();
int ans = INT_MAX;
int ns = 1<<k;
for(int i = 1 ; i <= k ; i++)
ans = min(ans,dp[ns-1][i]+cost[s[i]][n]);
cout<<ans;
return 0;
}