Cod sursa(job #786374)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 11 septembrie 2012 11:41:04
Problema Ubuntzei Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.44 kb
#include<fstream>
#include<vector>
#include<cmath>
#include<set>
using namespace std;
int n,m,K,C[15];
int d[15][15],d1[15],dn[15],Dist[2010];
struct Muchie{int x,y,cost;};
Muchie M[10100];
vector <int> G[2010];
int best[33000][15],sol=1000000000;

inline void Dijkstra()
{
	set <pair <int,int> > Q;
	pair <int,int> aux;
	int i,j,x,nod;
	vector <int>::iterator it;
	if(K==0)
	{
		for(j=1;j<=n;j++)
			Dist[j]=1000000000;
		Dist[1]=0;
		for(i=1;i<=n;i++)
			Q.insert(make_pair(Dist[i],i));
		for(i=1;i<n;i++)
		{
			aux=*Q.begin();
			Q.erase(Q.begin());
			x=aux.second;
			if(Dist[x]<aux.first)
				continue;
			for(it=G[x].begin();it!=G[x].end();it++)
			{
				nod=M[*it].x+M[*it].y-x;
				if(Dist[nod]>Dist[x]+M[*it].cost)
				{
					Dist[nod]=Dist[x]+M[*it].cost;
					Q.insert(make_pair(Dist[nod],nod));
				}
			}
		}
		sol=Dist[n];
		return;
	}
	for(i=0;i<K;i++)
	{
		d1[i]=dn[i]=1000000000;
		for(j=0;j<K;j++)
			d[i][j]=1000000000;
	}
	for(i=0;i<K;i++)
	{
		for(j=1;j<=n;j++)
			Dist[j]=1000000000;
		Dist[C[i]]=0;
		for(j=1;j<=n;j++)
			Q.insert(make_pair(Dist[j],j));
		for(j=1;j<n;j++)
		{
			aux=*Q.begin();
			Q.erase(Q.begin());
			x=aux.second;
			if(Dist[x]<aux.first)
				continue;
			for(it=G[x].begin();it!=G[x].end();it++)
			{
				nod=M[*it].x+M[*it].y-x;
				if(Dist[nod]>Dist[x]+M[*it].cost)
				{
					Dist[nod]=Dist[x]+M[*it].cost;
					Q.insert(make_pair(Dist[nod],nod));
				}
			}
		}
		for(j=0;j<K;j++)
			d[i][j]=Dist[C[j]];
		d1[i]=Dist[1];
		dn[i]=Dist[n];
	}
	
}

int main()
{
	int i,j,conf,lim;
	bool ok;
	ifstream fin("ubuntzei.in");
	fin>>n>>m>>K;
	for(i=0;i<K;i++)
	{
		fin>>C[i];
	}
	for(i=1;i<=m;i++)
	{
		fin>>M[i].x>>M[i].y>>M[i].cost;
		G[M[i].x].push_back(i);
		G[M[i].y].push_back(i);
	}
	fin.close();
	
	Dijkstra();
	if(K>0)
	{
		lim=(1<<K)-1;
		for(conf=1;conf<=lim;conf++)
		{
			ok=true;
			for(i=0;i<K;i++)
			{
				if(conf==(1<<i))
				{
					best[i][conf]=d1[i];
					ok=false;
					i=K+1;
				}
			}
			if(!ok)
				continue;
			for(i=0;i<K;i++)
			{
				best[i][conf]=1000000000;
				if((conf&(1<<i))!=0)
				{
					for(j=0;j<K;j++)
					{
						if(j!=i && (conf&(1<<j))!=0)
							best[i][conf]=min(best[i][conf],best[j][conf-(1<<i)]+d[j][i]);
					}
				}
			}
		}
		for(i=0;i<K;i++)
			sol=min(sol,best[i][lim]+dn[i]);
	}
	
	ofstream fout("ubuntzei.out");
	fout<<sol<<"\n";
	fout.close();
	return 0;
}