Pagini recente » Cod sursa (job #1194932) | Cod sursa (job #3190874) | Cod sursa (job #1942166) | Cod sursa (job #53181) | Cod sursa (job #2240318)
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
#define NMAX 2005
#define INF 1000000005
using namespace std;
struct lista{
int v,cost; /// v este partea a doua a muchei si cost este costul acesteia
};
struct coada{
int nod,cost; /// nod este nodul curent, iar cost este costul de pana aici de la nodul original
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) /// bfs cu dijkstra
{
for(int i = 1 ; i <= n ; i ++)
sol[i] = INF;
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] != INF)
continue;
sol[temp.nod] = cst;
for(vector<lista>::iterator it = L[val].begin() ; it != L[val].end() ; it++)
{
lista temp1 = *it; /// aici punem valoare din iterator in temp1
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] == INF)
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 masc = 0 ; masc < ns ; masc++)
{
for(int i = 1 ; i <= k ; i++)
if(masc & (1<<(i-1)) && masc != (1<<(i-1)))
{
dp[masc][i] = INF;
for(int j = 1 ; j <= k ; j++)
{
if(i != j && masc & (1 << (j-1)))
dp[masc][i] = min(dp[masc][i],dp[masc-(1<<(i-1))][j]+cost[s[j]][s[i]]);
}
}
}
}
int main()
{
freopen("ubuntzei.in","r",stdin);
freopen("ubuntzei.out","w",stdout);
int u , v, c;
scanf("%d%d",&n,&m);
scanf("%d",&k);
for(int i = 1 ; i <= k ; i++)
scanf("%d",&s[i]);
s[0] = 1;
s[++k] = n;
for(int i = 1 ; i <= m ; i++)
{
scanf("%d%d%d",&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 = INF;
int ns = 1<<k;
for(int i = 1 ; i <= k ; i++)
ans = min(ans,dp[ns-1][i]+cost[s[i]][n]);
printf("%d",ans);
return 0;
}