Pagini recente » Cod sursa (job #299540) | Istoria paginii runda/runda_3_sediul_turnurilor_minime | Cod sursa (job #1397052) | Cod sursa (job #710973) | Cod sursa (job #1060645)
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
#define inf 0xffffffff
#define put2(k) (1<<k)
#define minim(a,b) (a<b)?(a):(b)
using namespace std;
struct muchie {
int n,d;
};
struct comp {
bool operator()(muchie &a,muchie &b) {
return (a.d > b.d);
}
};
vector <muchie> v[2005];
priority_queue <muchie,vector<muchie>,comp> q;
vector <muchie> :: iterator it;
int dist[20][20];
unsigned a[33000][18];
bool viz[2005];
int u[20];
int n,m,k;
inline muchie mkmuc(int n, int d) {
muchie nou;
nou.n = n;
nou.d = d;
return nou;
}
inline unsigned int cautbin(int v) {
int s=0,f=k+1;
while (s<=f) {
int mij = (s+f)/2;
if (u[mij] == v) return mij;
if (u[mij] < v) s = mij+1;
else f = mij-1;
}
return inf;
}
void distance(int p,int nod,int v) {
unsigned int x = cautbin(nod);
if (x != inf) dist[x][p] = dist[p][x] = v;
}
void dijkstra(int s) {
q.push(mkmuc(u[s],0));
for (int i=0;i<=n;i++) viz[i] = false;
while (!q.empty()) {
muchie nod = q.top(); q.pop();
if (viz[nod.n]) continue;
viz[nod.n] = true;
distance(s,nod.n,nod.d);
for (it = v[nod.n].begin();it!=v[nod.n].end();it++) {
muchie muc = *it;
if (viz[muc.n]) continue;
q.push(mkmuc(muc.n,nod.d+muc.d));
}
}
}
unsigned int memoi() {
for (int i=1;i<=put2(k+2)-1;i++) {
for (int j=0;j<=k+1;j++) {
if ((i & put2(j)) != 0 && i != put2(j)) {
for (int l=0;l<=k+1;l++) {
if ((i & put2(l)) != 0 && i != put2(l)) if (a[i^put2(j)][l] != inf)
a[i][j] = minim(a[i][j],a[i^put2(j)][l]+dist[l][j]);
}
}
}
}
return a[put2(k+2)-1][k+1];
}
int main() {
freopen("ubuntzei.in","r",stdin);
freopen("ubuntzei.out","w",stdout);
for (int i=0;i<=19;i++) for (int j=0;j<=19;j++) a[i][j] = inf;
a[1][0] = 0;
scanf("%d %d %d",&n,&m,&k);
u[0] = 1; u[k+1] = n;
for (int i=1;i<=k;i++) scanf("%d",&u[i]);
sort(u+1,u+k+1);
for (int i=1;i<=m;i++) {
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
v[a].push_back(mkmuc(b,c));
v[b].push_back(mkmuc(a,c));
}
for (int i=0;i<=k;i++) dijkstra(i);
unsigned int distmin = inf;
printf("%u\n",memoi());
return 0;
}