Pagini recente » Cod sursa (job #1483135) | Cod sursa (job #3156187) | Cod sursa (job #2110066) | Cod sursa (job #1051046) | Cod sursa (job #3316363)
#include <fstream>
#include <bitset>
#include <vector>
#include <queue>
#include <climits>
using namespace std;
ifstream cin("apm.in");
ofstream cout("apm.out");
int n, m;
vector<vector<pair<int, int>>> graf;
bitset<(int)(2e5 + 2)> viz;
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> pq;
vector<int> parent;
vector<int> dist;
int totalCost = 0;
void prim() {
pq.push({0, 1});
dist[1] = 0;
while (!pq.empty()) {
auto [distance, node] = pq.top();
pq.pop();
if (!viz[node]) {
for (auto [new_node, new_distance] : graf[node]) {
if (!viz[new_node] && new_distance < dist[new_node]) {
dist[new_node] = new_distance;
pq.push({dist[new_node], new_node});
parent[new_node] = node;
}
}
viz[node] = 1;
totalCost += distance;
}
}
}
int main() {
cin >> n >> m;
graf.resize(n + 2);
dist.resize(n + 2, INT_MAX);
parent.resize(n + 2);
for (int i = 1 ; i <= m ; ++i) {
int src, dest, cost;
cin >> src >> dest >> cost;
graf[src].push_back({dest, cost});
graf[dest].push_back({src, cost});
}
prim();
cout << totalCost << "\n" << n - 1 << "\n";
for (int i = 2 ; i <= n ; ++i) {
cout << i << " " << parent[i] << "\n";
}
return 0;
}