Pagini recente » Cod sursa (job #757583) | Cod sursa (job #2822640) | Cod sursa (job #203559) | Cod sursa (job #1770941) | Cod sursa (job #2421676)
#include <iostream>
#include <fstream>
#include <queue>
#include <limits>
#include <vector>
const int infinity = std::numeric_limits<int>::max();
const int dim = 200001;
bool viz[dim];
bool inQ[dim];
int key[dim];
int parent[dim];
int noduri, muchii;
std::vector<std::pair<int, int>>G[dim];
struct cmp {
bool operator()(int i, int j) {
return key[i] > key[j];
}
};
std::priority_queue<int, std::vector<int>, cmp>pq;
void input() {
std::ifstream in("apm.in");
in >> noduri >> muchii;
for (int k = 1; k <= muchii; k++) {
int i, j, cost;
in >> i >> j >> cost;
G[i].push_back(std::make_pair(j, cost));
G[j].push_back(std::make_pair(i, cost));
}
for (int i = 2; i <= noduri; i++) {
key[i] = infinity;
}
key[1] = 0;
}
int main() {
int costFinal{ 0 };
input();
inQ[1] = true;
pq.push(1);
while (pq.empty() == false) {
int min = pq.top();
viz[min] = true;
pq.pop();
inQ[min] = false;
for (size_t y = 0; y < G[min].size(); y++) {
int vecin = G[min][y].first;
int cost = G[min][y].second;
if (cost < key[vecin] && !viz[vecin]) {
parent[vecin] = min;
key[vecin] = cost;
if (!inQ[vecin]) {
pq.push(vecin);
inQ[vecin] = true;
}
}
}
}
std::ofstream out("apm.out");
for (int i = 2; i <= noduri; i++) {
costFinal += key[i];
}
out << costFinal << "\n";
out << noduri - 1 << "\n";
for (int i = 2; i <= noduri; i++) {
out << i << " " << parent[i] << "\n";
}
return 0;
}