Cod sursa(job #2717043)

Utilizator StefanSanStanescu Stefan StefanSan Data 6 martie 2021 10:41:47
Problema Ubuntzei Scor 25
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.7 kb
#include      <iostream>
#include      <fstream>
#include      <queue>
#include      <vector>

using namespace std;

ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");

const int oo = (1 << 16) + 1;

int n, m, k, c[2001], d[2001];
bool inCoada[2001];

struct compara {
	bool operator()(int a, int b) {
		return d[a] > d[b];
	}
};

vector < pair < int, int > > G[2001];
priority_queue< int, vector < int >, compara > Q;

void dijkstra(int nod) {
	for (int i = 1; i <= n; i++)d[i] = oo;
	d[nod] = 0;
	Q.push(nod);
	inCoada[nod] = true;

	while (!Q.empty()) {
		int nod_curent = Q.top();
		Q.pop();
		inCoada[nod_curent] = false;

		for (unsigned int i = 0; i < G[nod_curent].size(); i++) {
			int vecin = G[nod_curent][i].first;
			int cost = G[nod_curent][i].second;

			if (d[vecin] > d[nod_curent] + cost) {
				d[vecin] = d[nod_curent] + cost;
				if (inCoada[vecin] == false) {
					inCoada[vecin] = true;
					Q.push(vecin);
				}
			}

		}

	}

}


int main() {

	ios::sync_with_stdio(false);
	in.tie(NULL), out.tie(NULL);

	in >> n >> m >> k;
	for (int i = 1; i <= k; i++) in >> c[i];
	for (int i = 1; i <= m; i++) {
		int x, y, c;
		in >> x >> y >> c;
		G[x].push_back(make_pair(y, c));
		G[y].push_back(make_pair(x, c));
	}

	int nod_start = 1, dis = 0, aux = 0, ck = k;
	while (aux != k) {
		int minim = oo;
		int v = 0, indice;
		dijkstra(nod_start);
		for (int i = 1; i <= ck; i++) {
			if (minim > d[c[i]]) {
				minim = d[c[i]];
				v = c[i];
				indice = i;
			}
		}
		nod_start = v;
		aux++;
		for (int i = indice; i < ck; i++) c[i] = c[i + 1];
		ck--;
		dis += d[v];
	}
	dijkstra(nod_start);
	out << dis + d[n];
	return 0;
}