Pagini recente » Cod sursa (job #865979) | Cod sursa (job #1950529) | Cod sursa (job #1256702) | Cod sursa (job #705035) | Cod sursa (job #1223899)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream ka("ubuntzei.in");
ofstream ki("ubuntzei.out");
const int N_MAX = 2000;
const int K_MAX = 15;
int n, m, k, opriri[K_MAX + 3];
int distante[K_MAX + 3][K_MAX + 3], sume[K_MAX+1][1 << (K_MAX+1)];
int dijdist[N_MAX + 1];
struct varf
{
int index;
int cost;
bool operator < (const varf arg) const
{
return arg.cost > cost;
}
};
vector <vector <varf> >dij(N_MAX + 1);
priority_queue <varf> coada;
int suma(int numar_nr, int configuratie, int terminatie)
{
if(numar_nr == 1)
return distante[1][terminatie+2];
if(!sume[terminatie][configuratie])
{
int s = 0x7fffffff;
for(int j = 0; j < (k+1); j++)
if((configuratie - (1<< terminatie)) & (1 << j))
s = min(s, suma(numar_nr - 1, configuratie - (1 << terminatie), j) + distante[terminatie+2][j+2]);
sume[terminatie][configuratie] = s;
}
return sume[terminatie][configuratie];
}
void dijkstra(int t)
{
varf v;
v.index = t;
v.cost = 0;
coada.push(v);
while(!coada.empty())
{
varf vv = coada.top();
coada.pop();
if (vv.cost == dijdist[vv.index]);
{
for(int i = 0; i < dij[vv.index].size(); i++)
{
if(vv.cost + dij[vv.index][i].cost < dijdist[dij[vv.index][i].index])
{
dijdist[dij[vv.index][i].index] = vv.cost + dij[vv.index][i].cost;
varf f;
f.index = dij[vv.index][i].index;
f.cost = dijdist[dij[vv.index][i].index];
coada.push(f);
}
}
}
}
}
int main()
{
ka >> n >> m >> k;
opriri[++opriri[0]] = 1;
for(int i = 1; i <= k; i++)
ka >> opriri[++opriri[0]];
opriri[++opriri[0]] = n;
int x, y, z;
for(int i = 1; i <= m; i++)
{
ka >> x >> y >> z;
varf v;
v.index = y;
v.cost = z;
dij[x].push_back(v);
v.index = x;
dij[y].push_back(v);
}
for(int i = 1; i <= opriri[0]; i++)
{
for(int j = 1; j <= n; j++)
dijdist[j] = 0x7fffffff;
dijdist[opriri[i]] = 0;
dijkstra(opriri[i]);
for(int j = 1; j <= opriri[0]; j++)
distante[i][j] = dijdist[opriri[j]];
}
ki << suma(k+1, (1 << (k+1)) -1, k);
}