Pagini recente » Cod sursa (job #2897613) | Cod sursa (job #2318231) | Cod sursa (job #636598) | Cod sursa (job #1318404) | Cod sursa (job #2426210)
#include <bits/stdc++.h>
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
const int inf = INT_MAX;
const int NMAX = 1005;
const int KMAX = 18;
int cost[NMAX][NMAX],frd[KMAX],n,m,k,dp[1 << KMAX][NMAX];
bool viz[NMAX];
vector < pair < int, int> > v[NMAX];
priority_queue < pair <int, int > > q;
void dijkstra(int start){
int i,nod,sz;
for(i = 1 ; i <= n ; i++)
viz[i] = 0;
cost[start][start] = 0;
q.push(make_pair(0,start));
while(!q.empty()){
nod = q.top().second;
q.pop();
if(viz[nod])
continue;
sz = v[nod].size();
for(i = 0 ; i < sz ; i++)
if(cost[start][v[nod][i].first] > cost[start][nod] + v[nod][i].second){
cost[start][v[nod][i].first] = cost[start][nod] + v[nod][i].second;
q.push(make_pair(-cost[start][v[nod][i].first], v[nod][i].first));
}
viz[nod] = 1;
}
}
int main(){
int i,j,a,b,c;
f >> n >> m >> k;
for(i = 1 ; i <= k ; i++)
f >> frd[i];
for(i = 1 ; i <= m ; i++){
f >> a >> b >> c;
v[a].push_back(make_pair(b,c));
v[b].push_back(make_pair(a,c));
}
for(i = 1 ; i <= n ; i++)
for(j = 1 ; j <= n ; j++)
cost[i][j] = inf;
k += 2;
frd[0] = 1;
frd[k - 1] = n;
for(i = 0 ; i < k ; i++)
dijkstra(frd[i]);
/*for(i = 1 ; i <= n ; i++){
for(j = 1 ; j <= n ; j++)
g << cost[i][j] << " ";
g << "\n";
}*/
int lim = (1 << k) - 1;
for ( i = 1; i<= lim; i++)
for ( j = 0; j<k; j++)
dp[j][i] = inf;
//dp[1][0] = 0;
for ( i = 0; i<k; i++)
dp[i][1 << i] = cost[1][frd[i]];
for(i = 1 ; i <= lim ; i++)
for(j = 0 ; j < k ; j++)
if(i & (1 << j)){
for (int z = 0; z<k; z++)
if (!((1<<(z))&i))
dp[z][i^(1<<(z))] = min(dp[z][i^(1<<(z))],dp[j][i]+cost[frd[j]][frd[z]]);
}
g << dp[k-1][lim];
return 0;
}