Pagini recente » Cod sursa (job #3282268) | Cod sursa (job #1433331) | Cod sursa (job #820535) | Cod sursa (job #2446036) | Cod sursa (job #838264)
Cod sursa(job #838264)
#include<fstream>
#include<set>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
#define inf 10000000
#define nmax 2007
#define mmax 10009
int N, M, K, dist[20][20];
int drum[1 << 16][16], d[nmax];
vector <pair<int,int> > G[nmax];
vector <int> S;
void read(){
fin >>N>>M>>K;
for(int i = 1; i <= K; i++){
int x;
fin >>x; --x;
S.push_back(x);
}
S.push_back(N - 1);
S.push_back(0);
K +=2;
for(int i = 1; i <= M; i++){
int x, y, cost;
fin >>x >>y >> cost;
--x; --y;
G[x].push_back(make_pair(cost,y));
G[y].push_back(make_pair(cost,x));
}
}
void Dijkstra(int x){
set<pair<int,int> >s;
s.insert(make_pair(0,x));
//memset(d , inf, sizeof(d));
for(int i = 0 ;i <= N; i++) d[i] = inf;
d[x] = 0;
while( ! s.empty() ){
int nod = (*s.begin()).second;
s.erase(s.begin());
for(int i = 0 ; i < G[nod].size(); i++)
if(d[G[nod][i].second] > d[nod] + G[nod][i].first){
d[G[nod][i].second] = d[nod] + G[nod][i].first;
s.insert(make_pair(G[nod][i].first,G[nod][i].second));
}
}
}
void solve(){
for(int i = 0 ;i < K; i++){
Dijkstra(S[i]);
for(int j = 0 ;j < K; j++)
dist[i][j] = d[S[j]];
}
for(int i = 0; i < (1<<K - 1); i++)
for(int j = 0 ;j <= K- 1;j++)
drum[i][j] = inf;
//memset(drum, inf, sizeof(drum));
for(int i = 0; i < K; i++)
drum[1<<i][i] = dist[K - 1][i];
for(int i = 0 ;i < ( 1<< (K - 1)); i++)
for(int j = 0; j < K - 1 ; j++)
{
if(drum[i][j] != inf)
for(int t = 0 ;t < K - 1; t++){
if( (1 << t) & (~i))
drum[ i | (1<<t)][t] = min (drum[i | (1<<t)][t] , drum[i][j] + dist[j][t]);
}
}
fout << drum [ (1 << (K - 1) ) - 1][K - 2];
}
int main(){
read();
solve();
fin.close();
return 0;
}