Pagini recente » Cod sursa (job #2058109) | Cod sursa (job #1929087) | Cod sursa (job #268342) | Cod sursa (job #1040449) | Cod sursa (job #1184670)
#include <stdio.h>
#include <iostream>
#include <queue>
#include <map>
#include <vector>
#include <set>
#include <string.h>
using namespace std;
#define COSTMAX 1001
#define MAXN 200000
struct Node {
int v;
int cost;
Node(int u, int c) : v(u), cost(c) {}
};
struct LessNode {
bool operator()(const Node& lhs, const Node& rhs) const {
if (lhs.cost == rhs.cost) {
return lhs.v < rhs.v;
}
return lhs.cost < rhs.cost;
}
};
map<int, vector<Node> > graph;
set<Node, LessNode> pq;
int dist[MAXN + 1];
int parent[MAXN + 1];
int primMST(int N) {
bool vis[N + 1];
memset(vis, false, sizeof (vis));
int MST = 0;
while (!pq.empty()) {
Node minCost = *(pq.begin());
MST += minCost.cost;
vis[minCost.v] = true;
vector<Node> neighbours = graph[minCost.v];
for (int i = 0; i < neighbours.size(); i++) {
Node curr = neighbours[i];
if (!vis[curr.v]) {
if (dist[curr.v] > curr.cost) {
set<Node>::iterator it = pq.find(Node(curr.v, dist[curr.v]));
pq.erase(it);
dist[curr.v] = curr.cost;
pq.insert(Node(curr.v, curr.cost));
parent[curr.v] = minCost.v;
}
}
}
pq.erase(minCost);
}
return MST;
}
int main() {
freopen("apm.in", "r", stdin);
freopen("apm.out", "w", stdout);
int N, M;
cin >> N >> M;
for (int i = 0; i < M; i++) {
int u, v, c;
cin >> u >> v >> c;
Node n(v, c);
graph[u].push_back(n);
graph[v].push_back(Node(u, c));
}
pq.insert(Node(1, 0));
memset(parent, 0, sizeof(parent));
dist[0] = 0;
dist[1] = 0;
for (int i = 2; i <= N; i++) {
pq.insert(Node(i, COSTMAX));
dist[i] = COSTMAX;
}
int minSum = primMST(N);
cout << minSum << endl;
cout << N - 1 << endl;
for (int i = 1; i <= N; i++) {
if (parent[i] != 0) {
cout << i << " " << parent[i] << endl ;
}
}
fclose(stdout);
}