Pagini recente » Monitorul de evaluare | Diferente pentru monthly-2012/runda-9/solutii intre reviziile 28 si 8 | Cod sursa (job #113150) | Monitorul de evaluare | Cod sursa (job #2841176)
/*
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