Cod sursa(job #2841176)

Utilizator claudiu.draghitadraghita claudiu claudiu.draghita Data 29 ianuarie 2022 12:57:32
Problema Ubuntzei Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.94 kb
/*
	n - localitati m - sosele bidirectionale  1  - > N
	k - localitati distincte
	lungime minima (dijkstra) - > ca dijkstra trebuie sa treaca prin toate cele k localitati
	input : n,m,k+1,x,y,cost
	output : lungime traseu
	k = 0 - > dijkstra normala - > 20 pct
	k <= 10 - > dijkstra modifcare - > 50 pct
	N <= 200 - >dijkstra modificare - > 70 pct

*/

// imp biblioteci
#include <fstream>
#include <queue>
#include <vector>
#include <iostream>
using namespace std;
using PI = pair <int, int>; // perechile coord
using VI = vector <int>; // distanta
using VP = vector <PI>; // vector pereche
using VVP = vector <VP>; // matrice vector perechi
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
int n, m, k, rez,frecventa[10000];
const int inf = (1 << 25);
VI distanta;
VVP Muchii; int numar;
priority_queue <PI, vector <PI>, greater <PI>> coada;
int prieteni[10000],t;
void dijkstra0(int);// 20 pct
void dijkstra10(int);
int main() {
	in >> n >> m;
	in >> k;
	Muchii = VVP(n + 1);
	t++;
	prieteni[t] = k;
	if (k) {
		int l;
		for (int i = 2; i <= k + 1; ++i) {
			in >> l;
			t++;
			prieteni[t] = l;
		}
	}
	cout << t << ' ';
	for (int i = 1; i <= m; ++i) {
		int x, y, z;
		in >> x >> y >> z;
		Muchii[x].emplace_back(y, z);
		Muchii[y].emplace_back(x, z);
	}
	if (k == 0) { dijkstra0(1); out << rez;}
	else
		if (k) {
			dijkstra10(1); out << rez, out << "  " << numar;
	}
}
void dijkstra0(int nod) {
	distanta = VI(n + 1, inf);
	distanta[nod] = 0;
	int dist;
	coada.push({ 0,nod }); // distanta si nod in coada
	while (!coada.empty()) {
		nod = coada.top().second;
		dist = coada.top().first; coada.pop();
		if (dist > distanta[nod]) continue;
		for (auto& i : Muchii[nod]) {
			int vecin = i.first;
			int cost = i.second;
			if (distanta[vecin] > distanta[nod] + cost) {
				distanta[vecin] = distanta[nod] + cost;
				coada.push({ distanta[vecin],vecin });
			}
		}
	}
	for (int i = 1; i < distanta.size(); ++i) {
		if (i == n ) {
			rez = distanta[i];
		}
	}
}
void dijkstra10(int nod) {
	distanta = VI(n + 1, inf);
	distanta[nod] = 0;
	coada.push({ 0,nod });
	int dist;
	while (!coada.empty()) {
		bool ok = false;
		nod = coada.top().second;
		dist = coada.top().first;
		coada.pop();
		if (dist > distanta[nod]) continue;
		for (auto& i : Muchii[nod]) {
			int vecin = i.first;
			int cost = i.second;
			if (distanta[vecin] > distanta[nod] + cost) {
				for (int j = 1; j <= t; ++j) {
					if (vecin == prieteni[j] && frecventa[vecin] == 0) {
						ok = true;
						cout << vecin << " ";
						frecventa[vecin] = 1;
						distanta[vecin] = distanta[nod] + cost;
						coada.push({ distanta[vecin],vecin });
						numar++;
					}
				}
				if(ok == false)
				{
					distanta[vecin] = distanta[nod] + cost;
					coada.push({ distanta[vecin],vecin });
				}
			}
		}
	}
	for (int i = 1; i < distanta.size(); ++i) {
		if (i == n) rez = distanta[i];
	}
}
// 4 16 17 22 20