Cod sursa(job #786347)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 11 septembrie 2012 10:43:05
Problema Ubuntzei Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include<fstream>
#include<vector>
#include<cmath>
#include<queue>
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;

inline void BellmanFord()
{
	queue <int> Q;
	int i,j,x,nod;
	vector <int>::iterator it;
	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++)
	{
		Q.push(C[i]);
		for(j=1;j<=n;j++)
			Dist[j]=1000000000;
		Dist[C[i]]=0;
		while(!Q.empty())
		{
			x=Q.front();
			Q.pop();
			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.push(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();
	
	BellmanFord();
	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]);
				}
			}
		}
	}
	sol=1000000000;
	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;
}