Cod sursa(job #604668)

Utilizator paul_gabryelPaul Buda paul_gabryel Data 24 iulie 2011 13:03:23
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb

#include <cstdio>
#include <fstream>
#include <set>
#include <climits>
#include <algorithm>
#include <vector>

using namespace std;

#define f first
#define s second
#define mp make_pair

int n,m,k,c[16],pd[32768][16],srs[2001],pt[16][2001],i,j,l,kk,nc,sol;
vector<pair<int,int> >v[2001];
set<pair<int,int> >s;

void solve (int x,int *ss){
	
	s.clear();
	ss[x]=0;
	s.insert(mp(ss[x],x));
	for(i=1;i<=n;++i)
		if(i!=x){
			ss[i]=INT_MAX;
			s.insert(mp(ss[i],i));
			}
	for(i=1;i<n;++i){
		pair<int,int> tp=*s.begin();
		s.erase(s.begin());
		if(ss[tp.s]<tp.f)continue;
		for(vector<pair<int,int> >::iterator it=v[tp.s].begin();it<v[tp.s].end();++it)
			if(ss[it->f]>ss[tp.s]+it->s){
				ss[it->f]=ss[tp.s]+it->s;
				s.insert(mp(ss[it->f],it->f));
				}
		}
	
	}

int main ()
{
	
	ifstream in ("ubuntzei.in");
	freopen ("ubuntzei.out","w",stdout);
	in>>n>>m>>k;
	for(i=0;i<k;++i)
		in>>c[i];
	for(;m;--m){
		in>>i>>j>>l;
		v[i].push_back(mp(j,l));
		v[j].push_back(mp(i,l));
		}
	solve(1,srs),l=1<<k;
	if(k==0)
		printf("%d",srs[n]);
	else{
		for(i=0;i<k;++i)
			solve(c[i],pt[i]);
		for(i=1;i<l;++i){
			for(j=0;j<k;++j)
				if(i==(1<<j))
					break;
			if(j<k&&i==(1<<j)){
				pd[i][j]=srs[c[j]];
				continue;}
			for(j=0;j<k;++j){
				pd[i][j]=INT_MAX;
				if((i&(1<<j))!=0)
					for(kk=0;kk<k;++kk)
						if(k!=j&&((i&(1<<kk))!=0)){
							nc=pd[i-(1<<j)][kk]+pt[kk][c[j]];
							pd[i][j]=min(pd[i][j],nc);
							}
				}
			}
		}
	sol=INT_MAX;
	for(i=0;i<k;++i)
		sol=min(sol,pd[(1<<k)-1][i]+pt[i][n]);
	printf("%d",sol);
	
	return 0;}