Pagini recente » Cod sursa (job #1334037) | Cod sursa (job #774567) | Cod sursa (job #797302) | Cod sursa (job #110879) | Cod sursa (job #1326261)
#include<fstream>
#include<set>
#include<vector>
#include<string>
#include<queue>
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
struct dij{
int nr, cost;
};
struct classcomp {
bool operator() (const dij& lhs, const dij& rhs) const
{return lhs.cost>rhs.cost;}
};
const int nmax = 2006, inf = 600000000, kmax = 16;
int n, m, vcost[nmax][nmax], k, vprieteni[16], d[kmax][(1<<kmax) + 6], rasp = inf;
vector<dij> vecini[nmax];
//multiset <dij, classcomp> s;
bool poz[nmax];
priority_queue <dij, vector <dij>, classcomp> q;
void dijkstra(int x)
{
for(int i = 1; i<=n; i++)
poz[i] = 0;
vcost[x][x] = 0;
poz[x] = 1;
for(int i = 0; i<(int)vecini[x].size(); i++)
{
dij aux;
aux.nr = vecini[x][i].nr;
aux.cost = vecini[x][i].cost;
q.push(aux);
}
while(q.empty()==0)
{
dij aux = q.top();
if(poz[aux.nr]==0)
{
vcost[x][aux.nr] = aux.cost;
poz[aux.nr] = 1;
for(int i = 0; i<(int)vecini[aux.nr].size(); i++)
{
if(poz[vecini[aux.nr][i].nr]==0)
{
dij aux2;
aux2.cost = aux.cost + vecini[aux.nr][i].cost;
aux2.nr = vecini[aux.nr][i].nr;
q.push(aux2);
}
}
}
q.pop();
}
}
int main(){
int player_unu=0;
in>>n>>m>>k;
for(int i = 0; i<k; i++)
in>>vprieteni[i];
for(int i = 0; i<m; i++)
{
int x, y, cost;
in>>x>>y>>cost;
dij aux, aux2;
aux.cost = cost, aux2.cost = cost;
aux.nr = y, aux2.nr = x;
vecini[x].push_back(aux);
vecini[y].push_back(aux2);
}
for(int i = 1; i<=n; i++)
dijkstra(i);
for(int i = 0; i<(1<<k); i++)
for(int j = 0; j<k; j++)
d[j][i] = inf;
for(int i = 0; i<k; i++)
{
d[i][1<<i] = vcost[1][vprieteni[i]];
}
for(int i = 1; i<(1<<k); i++)
{
for(int j = 0; j<k; j++)
{
if((i & (1<<j))==(1<<j))
{
for(int h = 0; h<k; h++)
{
if((i & (1<<h))==0)
{
d[h][i | (1<<h)] = min(d[h][i | (1<<h)], d[j][i] + vcost[vprieteni[h]][vprieteni[j]]);
}
}
}
}
}
if(k==0)
{
out<<vcost[1][n]<<'\n';
return 0;
}
for(int i = 0; i<k; i++)
rasp = min(rasp, d[i][(1<<k) - 1] + vcost[vprieteni[i]][n]);
out<<rasp<<'\n';
return player_unu;
}