Pagini recente » Cod sursa (job #468382) | Cod sursa (job #480687) | Cod sursa (job #2859230) | Cod sursa (job #2348420) | Cod sursa (job #2503474)
#include <bits/stdc++.h>
#define Nmax 2000
using namespace std;
ifstream fin ("ubuntzei.in");
ofstream fout ("ubuntzei.out");
int k, n, m, d[1<<15][Nmax], a[16], x, y, c;
struct muchie
{
int x, c;
};
vector <muchie> v[Nmax];
vector <int> o[16];
void init()
{
for(int m=0; m<(1<<k); m++)
for(int i=1; i<=n; i++)
d[m][i]=INT_MAX;
d[0][1]=0;
}
struct criteriu
{
bool operator()(muchie x, muchie y)
{
if(x.c!=y.c)
return x.c<y.c;
return x.x<y.x;
}
};
int nrbiti(int x)
{
int k=0;
while(x)
{
x=x&(x-1);
k++;
}
return k;
}
int main()
{
fin >> n >> m >> k;
for(int i=0; i<k; i++)
fin >> a[i];
for(int i=1; i<=m; i++)
{
fin >> x >> y >> c;
v[x].push_back({y, c});
v[y].push_back({x, c});
}
for(int i=0; i<(1<<k); i++)
o[nrbiti(i)].push_back(i);
init();
for(int i=0; i<=k; i++)
for(int j=0; j<o[i].size(); j++)
{
m = o[i][j];
set <muchie, criteriu> s;
for(int l=1; l<=n; l++)
s.insert({l, d[m][l]});
while(!s.empty())
{
set <muchie, criteriu> :: iterator it = s.begin();
int aux=it->x;
for(int l=0; l<v[it->x].size(); l++)
if(d[m][v[it->x][l].x] > d[m][it->x]+v[it->x][l].c)
{
s.erase(s.find({v[it->x][l].x, d[m][v[it->x][l].x]}));
d[m][v[it->x][l].x]=d[m][it->x]+v[it->x][l].c;
s.insert({v[it->x][l].x, d[m][v[it->x][l].x]});
}
s.erase(it);
}
for(int j=0; j<k; j++)
d[m|(1<<j)][a[j]]=min(d[m|(1<<j)][a[j]], d[m][a[j]]);
}
fout << d[(1<<k)-1][n];
return 0;
}