Cod sursa(job #1326238)

Utilizator nimicLeoveanu Mihaita Alexandru nimic Data 24 ianuarie 2015 22:41:58
Problema Ubuntzei Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 kb
#include<fstream>
#include<set>
#include<vector>
#include<string>
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");

struct dij{
	int nr, cost;
};

struct classcomp {
  bool operator() (const dij& lhs, const dij& rhs) const
  {return lhs.cost<rhs.cost;}
};

const int nmax = 2006, inf = 600000000, kmax = 16;
int n, m, vcost[nmax][nmax], k, vprieteni[16], d[kmax][(1<<kmax) + 6], rasp = inf;
vector<dij> vecini[nmax];
multiset <dij, classcomp> s;
bool poz[nmax];
	 
void dijkstra(int x)
{
	for(int i = 1; i<=n; i++)
		poz[i] = 0;

	vcost[x][x] = 0;
	poz[x] = 1;

	for(int i = 0; i<(int)vecini[x].size(); i++)
	{
		dij aux;

		aux.nr = vecini[x][i].nr;
		aux.cost = vecini[x][i].cost;

		s.insert(aux);
	}

	while(s.empty()==0)
	{
		dij aux = *s.begin();

		if(poz[aux.nr]==0)
		{
			vcost[x][aux.nr] = aux.cost;
			poz[aux.nr] = 1;

			for(int i = 0; i<(int)vecini[aux.nr].size(); i++)
			{
				if(poz[vecini[aux.nr][i].nr]==0)
				{
					dij aux2;

					aux2.cost = aux.cost + vecini[aux.nr][i].cost;
					aux2.nr  = vecini[aux.nr][i].nr;

					s.insert(aux2);
				}
			}
		}

		s.erase(s.begin());
	}
}

int main(){
	int player_unu=0;

	in>>n>>m>>k;
	for(int i = 0; i<k; i++)
		in>>vprieteni[i];
	for(int i = 0; i<m; i++)
	{
		int x, y, cost;
		in>>x>>y>>cost;

		dij aux, aux2;
		aux.cost = cost, aux2.cost = cost;
		aux.nr = y, aux2.nr = x;

		vecini[x].push_back(aux);
		vecini[y].push_back(aux2);
	}

	for(int i = 1; i<=n; i++)
		dijkstra(i);

	for(int i = 0; i<(1<<k); i++)
		for(int j = 0; j<k; j++)
			d[j][i] = inf;

	for(int i = 0; i<k; i++)
	{
		d[i][1<<i] = vcost[1][vprieteni[i]];
	}

	for(int i = 1; i<(1<<k); i++)
	{
		for(int j = 0; j<k; j++)
		{
			if((i & (1<<j))==(1<<j))
			{
				for(int h = 0; h<k; h++)
				{
					if((i & (1<<h))==0)
					{
						d[h][i | (1<<h)] = min(d[h][i | (1<<h)], d[j][i] + vcost[vprieteni[h]][vprieteni[j]]);
					}
				}
			}
		}
	}

	if(k==0)
	{
		out<<vcost[1][n]<<'\n';
		return 0;
	}

	for(int i = 0; i<k; i++)
		rasp = min(rasp, d[i][(1<<k) - 1] + vcost[vprieteni[i]][n]);

	out<<rasp<<'\n';

	return player_unu;
}