Pagini recente » Cod sursa (job #1635040) | Cod sursa (job #2453500) | Cod sursa (job #944667) | Cod sursa (job #2406083) | Cod sursa (job #670524)
Cod sursa(job #670524)
#include <cstdio>
#include <vector>
#include<algorithm>
#include <queue>
#define infile "ubuntzei.in"
#define outfile "ubuntzei.out"
#define INF 1<<30
#define k_max 15
#define n_max 10005
#define pii pair<int, int>
#define f first
#define s second
#define mp make_pair
#define pb push_back
#define FOR(g) \
for(vector<pii> :: iterator it = g.begin(); it!=g.end(); ++it)
using namespace std;
int N, M, K, C[k_max];
int source[n_max], path[k_max][n_max];
vector < pii > G[n_max];
int pd[1<<k_max][k_max];
int Best;
void citeste()
{
freopen(infile, "r", stdin);
int x, y, z;
scanf("%d %d %d", &N, &M, &K);
for (int i = 0; i < K; ++i)
scanf("%d", &C[i]);
while(M--)
{
scanf("%d %d %d", &x, &y, &z);
G[x].pb(mp(y,z));
G[y].pb(mp(x,z));
}
fclose(stdin);
}
void dijkstra(int sursa, int *dist)
{
priority_queue < pii > H;
for (int i = 1; i <= N; ++i)
dist[i] = INF;
dist[sursa] = 0;
for (int i = 1; i <= N; ++i)
H.push(mp(-dist[i],i));
for (int i = 1; i < N; ++i)
{
int nod = H.top().s;
H.pop();
FOR(G[nod])
if (dist[(*it).f] > dist[nod] + (*it).s)
{
dist[(*it).f] = dist[nod] + (*it).s;
H.push(mp(-dist[(*it).f], (*it).f));
}
}
}
void rezolva()
{
int i, j, k, newCost;
dijkstra(1, source);
if (!K)
{
Best = source[N];
return;
}
for (i = 0; i < K; ++i)
dijkstra(C[i], path[i]);
for (i = 1; i < (1<<K); ++i)
{
for (j = 0; j < K; ++j)
if (i == (1<<j))
break;
if (j < K && i == (1<<j))
{
pd[i][j] = source[C[j]];
continue;
}
for (j = 0; j < K; ++j)
{
pd[i][j] = INF;
if (i&(1<<j))
for (k = 0; k < K; ++k)
if (k != j && (i&(1<<k)))
{
newCost = pd[i-(1<<j)][k] + path[k][C[j]];
pd[i][j] = min(pd[i][j], newCost);
}
}
}
Best = INF;
for (i = 0; i < K; ++i)
Best = min(Best, pd[(1<<K)-1][i] + path[i][N]);
}
void afiseaza()
{
freopen(outfile, "w", stdout);
printf("%d\n", Best);
fclose(stdout);
}
int main()
{
citeste();
rezolva();
afiseaza();
return 0;
}