Pagini recente » Cod sursa (job #2300541) | Cod sursa (job #2110396) | Solutii preONI 2007, Runda 1 | Cod sursa (job #290345) | Cod sursa (job #1118489)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#define INF ~(1<<31)
using namespace std;
struct vecin
{
int nod, d;
vecin(int nod = 0, int d = 0): nod(nod), d(d)
{
}
};
vector<vecin> vec[2011];
int cost[20][20];
int best[2011];
struct cmp
{
bool operator()(const int & a, const int &b)
{
return best[a] > best[b];
}
};
int n, k;
int mat[20][132000];
int prieten[2011];
int pr[20];
void citire()
{
int m, x, y, c;
scanf("%d%d", &n, &m);
scanf("%d", &k);
pr[0] = 1;
for(int i = 1; i <= k; i++)
{
scanf("%d", &pr[i]);
prieten[pr[i]] = 1;
}
k++;
pr[k++] = n;
for(int i = 0; i < m; i++)
{
scanf("%d%d%d", &x, &y, &c);
vec[x].push_back(vecin(y, c));
vec[y].push_back(vecin(x, c));
}
for(int i = 0; i < k; i++)
{
for(int j = 1; j < 1<<k; j++)
mat[i][j] = INF;
mat[i][1<<i] = 0;
}
}
priority_queue<int, vector<int>, cmp> q;
void dijkstra(int x)
{
int start = pr[x];
for(int i = 0; i <= n; i++)
best[i] = INF;
int nou, crt;
int c;
best[start] = 0;
q.push(start);
while(!q.empty())
{
crt = q.top();
q.pop();
for(int i = 0; i < vec[crt].size(); i++)
{
nou = vec[crt][i].nod;
c = best[crt] + vec[crt][i].d;
if(c < best[nou])
{
best[nou] = c;
q.push(nou);
}
}
}
for(int i = 0; i < k; i++)
cost[x][i] = cost[i][x] = best[pr[i]];
}
void calc_cost()
{
for(int i = 0; i < k-1; i++)
dijkstra(i);
}
void debug_cost()
{
for(int i = 0; i < k; i++)
{
for(int j = 0; j < k; j++)
printf("%d ", cost[i][j]);
printf("\n");
}
}
int dinamica(int i, int s)
{
if(i < 0 || s < 0)
return 0;
if(mat[i][s] != INF)
return mat[i][s];
for(int j = 0; j < k; j++)
if(j != i && (s & (1<<j)))
mat[i][s] = min(mat[i][s], dinamica(j, s & ~(1 << i)) + cost[i][j]);
return mat[i][s];
}
int main()
{
freopen("ubuntzei.in", "r", stdin);
freopen("ubuntzei.out", "w", stdout);
citire();
calc_cost();
//debug_cost();
printf("%d\n", dinamica(k-1, (1 << k) - 1));
return 0;
}