Cod sursa(job #786423)

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

void BellmanFord(int start,int Dist[])
{
	queue <int> Q;
	int i,x,nod;
	vector <int>::iterator it;
	for(i=1;i<=n;i++)
		Dist[i]=1000000000;
	Dist[start]=0;
	Q.push(start);
	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);
			}
		}
	}
}

int main()
{
	int i,j,conf,lim;
	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(1,d1);
	if(K==0)
		sol=d1[n];
	else
	{
		for(i=0;i<K;i++)
			BellmanFord(C[i],Dist[i]);
		lim=(1<<K)-1;
		for(conf=1;conf<=lim;conf++)
		{
			for(i=0;i<K;i++)
				if(conf==(1<<i))
					break;
			if(i<K && conf==(1<<i))
			{
				best[i][conf]=d1[C[i]];
				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)]+Dist[j][C[i]]);
						}
					}
				}
			}
		}
		for(i=0;i<K;i++)
			sol=min(sol,best[i][lim]+Dist[i][n]);
	}

	ofstream fout("ubuntzei.out");
	fout<<sol<<"\n";
	fout.close();
	return 0;
}