Pagini recente » Monitorul de evaluare | Cod sursa (job #2411498) | Cod sursa (job #729471) | Clasament baraj_oni_2007 | Cod sursa (job #1564242)
#include<fstream>
#include<vector>
#include<deque>
#include<cstring>
const int INF = 0x3f3f3f3f;
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int D[17][2005],C[20][20],a[2005],k,n,m,w[20],x,y,z;
char f[2005];
vector< pair<int,int> > v[2005];
deque<int> d;
int bf( int st, int dr ){
d.push_back(st);
a[st] = 0;
memset(a,INF,sizeof(a));
while( !d.empty() ){
int nod = d.front();
f[nod] = 1;
for( int i = 0; i < v[nod].size(); i++ ){
int vecin = v[nod][i].first;
if( a[vecin] > a[nod] + v[nod][i].second ){
a[vecin] = a[nod] + v[nod][i].second;
if( f[vecin] == 0 ){
f[vecin] = 1;
d.push_back(vecin);
}
}
}
f[nod] = 0;
d.pop_front();
}
return a[dr];
}
int hamilton( int conf, int i){
if( conf == 1 && i == 0 ){
return 0;
}
if( D[conf][i] != 0 ){
return D[conf][i];
}else{
D[conf][i] = INF;
int conf1 = conf - (1<<i);
for( int j = 0; j < k ; j++ ){
if( (conf1>>j) & 1 == 1 ){
D[conf][i] = min( D[conf][i], hamilton(conf1,w[j]) + C[w[j]][i] );
}
}
return D[conf][i];
}
}
int main(){
fin >> n >> m >> k;
w[0] = 0;
w[k+1]= n - 1;
for( int i = 1; i <= k; i++ ){
fin >> w[i];
w[i]--;
}
k+=2;
for( int i = 1; i <= m; i++ ){
fin >> x >> y >> z;
x--; y--;
v[x].push_back(make_pair(y,z));
v[y].push_back(make_pair(x,z));
}
memset( C, INF,sizeof(C) );
for( int i = 0; i < k ; i++ ){
for( int j = i + 1; j <= k ;j++ ){
if( w[i] != w[j] )
C[i][j] = C[j][i] = bf( w[i],w[j] );
}
}
hamilton( (1<<k) - 1, n );
fout << D[(1<<k) - 1][n];
return 0;
}