Cod sursa(job #2289985)

Utilizator eilerGabriel-Ciprian Stanciu eiler Data 25 noiembrie 2018 16:44:47
Problema Ubuntzei Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <fstream>
#include <vector>
using namespace std;

struct drum{
	int y, l;
};

int N, M, K, C[17], D[17][17], Dm=1e9;
int dist[2001];
bool Viz[2001];
vector<drum> L[2001];

void Dijk(int q, int r){
	int i, j, k;

	for (i=1; i<=N; i++){
		dist[i]=1e9;
		Viz[i]=false;
	}
	dist[r]=0;

	dist[0]=1e9;
	for (i=1; i<=N; i++){
		k=0;
		for (j=1; j<=N; j++)
			if (Viz[j]==false && dist[j]<dist[k])
				k=j;

		Viz[k]=true;
		for (j=0; j<L[k].size(); j++)
			if (Viz[L[k][j].y]==false && dist[L[k][j].y]>dist[k]+L[k][j].l)
				dist[L[k][j].y]=dist[k]+L[k][j].l;
	}

	for (i=0; i<=K+1; i++)
		D[q][i]=dist[C[i]];
}

void Genereaza(int k, int l, int p){
	if (k==K+1){
		Dm=min(Dm, l+D[p][K+1]);
		return;
	}

	for (int i=1; i<=K; i++)
		if (Viz[i]==false && l+D[p][i]<Dm){
			Viz[i]=true;
			Genereaza(k+1, l+D[p][i], i);
			Viz[i]=false;
		}
}

int main(){
	int i, a, b, c;

	ifstream fin ("ubuntzei.in");
	fin >> N >> M >> K;
	C[0]=1;
	for (i=1; i<=K; i++)
		fin >> C[i];
	C[K+1]=N;
	for (i=0; i<M; i++){
		fin >> a >> b >> c;
		L[a].push_back({b, c});
		L[b].push_back({a, c});
	}
	fin.close();

	for (i=0; i<=K+1; i++)
		Dijk(i, C[i]);

	for (i=1; i<=K; i++)
		Viz[i]=false;
	Genereaza(1, 0, 0);

	ofstream fout ("ubuntzei.out");
	fout << Dm;
	fout.close();

	return 0;
}