Pagini recente » Cod sursa (job #2755951) | Cod sursa (job #3221447) | Cod sursa (job #1607758) | Cod sursa (job #2116336) | Cod sursa (job #1435660)
#include <fstream>
#include <iostream>
#include <vector>
#include <set>
#define nmax 2500
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
vector <pair <int, int> > graf[nmax], graf2[nmax];
set <pair <int, int> > S;
int v[nmax], N, M, K, Suma, costuri[nmax], dp[nmax][nmax];
const int inf = 1 <<29;
void initalizare(int nod){
int i;
for(i = 1; i <= N; ++i)
costuri[i] = inf;
costuri[nod] = 0;
}
void dijkstra(int inceput){
int val, nod, i;
initalizare(v[inceput]);
S.insert( make_pair(costuri[v[inceput]], v[inceput]) );
while( !S.empty() ){
val = ( *S.begin() ).first;
nod = ( *S.begin() ).second;
S.erase( *S.begin() );
for(i = 0; i < graf[nod].size(); ++i){
if( costuri[graf[nod][i].first] > val + graf[nod][i].second ){
S.erase( make_pair( costuri[graf[nod][i].first], graf[nod][i].first) );
costuri[graf[nod][i].first] = val + graf[nod][i].second;
S.insert( make_pair( costuri[graf[nod][i].first], graf[nod][i].first) );
}
}
}
//afisare();
for(i = 0; i <= K; ++i)
graf2[inceput].push_back( make_pair( i, costuri[ v[i] ] ) );
}
int Hamilton(){
int s = ( 1 << (K) ), mask, i, j, k;
for(i = 0; i < s; ++i)
for(j = 0; j <= K + 1; ++j)
dp[i][j] = inf;
dp[0][0] = 0;
for(mask = 0; mask < s; ++mask)
for(j = 0; j <= K; ++j)
if(dp[i][j] != inf){
//g<<"ok"<<'\n';
for(k = 0; k < graf2[j].size(); ++k){
if(! (mask & (1 << k) ) ){
int node = graf2[j][k].first;
dp[mask | ( 1 << k )][node] = min( dp[mask | ( 1 << k )][node], dp[mask][j] + graf2[j][k].second );
}
}
}
int sol = inf;
for(i = 1; i <= K; ++i)
sol = min( sol, dp[s - 1][i] + graf2[i][K].second );
return sol;
}
int main()
{int i, a, b, c;
f>>N>>M>>K;
v[0] = 1;
for(i = 1; i <= K; ++i)
f>>v[i];
v[++K] = N;
for(i = 1; i <= M; ++i){
f>>a>>b>>c;
graf[a].push_back(make_pair(b, c) );
graf[b].push_back(make_pair(a, c) );
}
for(i = 0; i <= K; ++i)
dijkstra(i);
for (int i = 0; i <= K; ++i)
for (int j = 0; j < graf2[i].size(); ++j)
cerr << i << " " << graf2[i][j].first << " " << graf2[i][j].second << "\n";
if(K == 0){
g<<graf2[0][1].second<<'\n';
return 0;
}
g<<Hamilton()<<'\n';
return 0;
}