Pagini recente » Cod sursa (job #2590006) | Cod sursa (job #1344802) | Cod sursa (job #754645) | Cod sursa (job #1755891) | Cod sursa (job #1307612)
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
const int NMAX = 2000;
const int KMAX = 15;
const int INF = 2000000000;
struct drum
{
short int dest;
int lung;
drum (short int dest = 0, int lung = 0)
{
this->dest = dest;
this->lung = lung;
}
};
int n, m, k, tata;
int dist[KMAX + 1][NMAX + 1], oras[NMAX + 1], cost[(1 << (KMAX + 1))][KMAX + 1];
bool viz[NMAX];
vector <drum> v[NMAX + 1];
queue <int> hp;
void dijkstra (short int nod)
{
int fiu;
memset (viz, 0, sizeof (viz));
viz[nod] = true;
hp.push (nod);
while (!hp.empty ())
{
nod = hp.front ();
hp.pop ();
for (int i = 0; i < v[nod].size (); ++i)
{
fiu = v[nod][i].dest;
if (!dist[tata][fiu] || dist[tata][fiu] > dist[tata][nod] + v[nod][i].lung)
{
dist[tata][fiu] = dist[tata][nod] + v[nod][i].lung;
if(!viz[fiu])
{
viz[fiu] = true;
hp.push (fiu);
}
}
}
viz[nod] = false;
}
}
int din (int stare, short int ultim)
{
if (cost[stare][ultim])
return cost[stare][ultim];
if (stare == (1 << ultim))
return dist[k][oras[ultim]];
int sol = INF, x = stare - ( 1 << ultim);
for (short int i = 0; i < k; ++i)
{
if (x & (1 << i))
{
int aux = din(x, i) + dist[i][oras[ultim]];
if (sol > aux)
sol = aux;
}
}
cost[stare][ultim] = sol;
return sol;
}
int main ()
{
freopen ("ubuntzei.in", "r", stdin);
freopen ("ubuntzei.out", "w", stdout);
int x, y, c;
scanf ("%d%d%d", &n, &m, &k);
for (int i = 0; i < k; ++i)
scanf ("%d", &oras[i]);
for (int i = 0; i < m; ++i)
{
scanf ("%d%d%d", &x, &y, &c);
v[x].push_back (drum (y, c));
v[y].push_back (drum (x, c));
}
for (int i = 0; i < k; ++i)
{
tata = i;
dijkstra (oras[i]);
}
tata = k;
dijkstra (1);
int sol = INF;
if (k == 0)
sol = dist[0][n];
for (int i = 0; i < k; ++i)
{
int aux = din((1 << k) - 1, i) + dist[i][n];
if( aux < sol)
sol = aux;
}
printf ("%d\n", sol);
return 0;
}