Pagini recente » Cod sursa (job #1554083) | Cod sursa (job #276525) | Cod sursa (job #1283329) | Cod sursa (job #438412) | Cod sursa (job #882569)
Cod sursa(job #882569)
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
const int INF = (int)(1e9 + 7);
const int MAXN = 200001;
priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > pq;
bool vis[MAXN];
int parent[MAXN];
int d[MAXN];
int n;
vector<int> G[MAXN];
vector<int> C[MAXN];
void prim()
{
for (int i = 2; i <= n; ++i) {
d[i] = INF;
parent[i] = -1;
vis[i] = false;
}
parent[1] = -1;
d[1] = 0;
int total_cost = 0;
vector<pair<int, int> > edges;
pq.push(make_pair(d[1], 1));
while (!pq.empty()) {
int cost = pq.top().first;
int node = pq.top().second;
pq.pop();
if (vis[node])
continue;
vis[node] = true;
total_cost += cost;
if (parent[node] != -1)
edges.push_back(make_pair(node, parent[node]));
for (int i = 0; i < G[node].size(); ++i) {
int next = G[node][i];
if (vis[next])
continue;
if (d[next] > C[node][i]) {
d[next] = C[node][i];
parent[next] = node;
pq.push(make_pair(d[next], next));
}
}
}
printf("%d\n", total_cost);
printf("%lu\n", edges.size());
for (int i = 0; i < edges.size(); ++i)
printf("%d %d\n", edges[i].first, edges[i].second);
}
int main()
{
freopen("apm.in", "r", stdin);
freopen("apm.out", "w", stdout);
int m;
scanf("%d %d", &n, &m);
for (int i = 0; i < m; ++i) {
int x, y, c;
scanf("%d %d %d", &x, &y, &c);
G[x].push_back(y);
C[x].push_back(c);
G[y].push_back(x);
C[y].push_back(c);
}
prim();
return 0;
}