Pagini recente » Cod sursa (job #2486450) | Cod sursa (job #697104) | Cod sursa (job #572560) | Cod sursa (job #3271485) | Cod sursa (job #2240395)
#include <fstream>
#include <queue>
#include <vector>
#include <algorithm>
const int NMAX=2005;
const int INF=1000000005;
using namespace std;
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 bfs(int nod)
{
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;
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];
}
}
int main()
{
ifstream cin("ubuntzei.in");
ofstream cout("ubuntzei.out");
int a , b, 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>>a>>b>>c;
lista temp;
temp.cost = c;
temp.v = b;
L[a].push_back(temp);
temp.cost = c;
temp.v = a;
L[b].push_back(temp);
}
for(int i = 0 ; i <= k ; i++)
bfs(s[i]);
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 ans = INF;
int nices = 1<<k;
for(int i = 1 ; i <= k ; i++)
ans = min(ans,dp[nices-1][i]+cost[s[i]][n]);
cout<<ans;
return 0;
}