Cod sursa(job #1060645)

Utilizator beldeabogdanBogdan Beldea beldeabogdan Data 18 decembrie 2013 11:24:35
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.14 kb
#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;
}