Pagini recente » Istoria paginii runda/oni_2007_ziua1_clasele_xi-xii | Cod sursa (job #364710) | Cod sursa (job #517447) | Cod sursa (job #865450) | Cod sursa (job #2424477)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <limits.h>
#define NLIM 200001
using namespace std;
ifstream f("apm.in");
ofstream g("apm.out");
struct cmpDis {
bool operator()(pair<int, int> &a, pair<int, int> &b) {
return a.second > b.second;
}
};
priority_queue<pair<int, int>, vector< pair<int, int> >, cmpDis> Coada;
vector< pair<int, int> > Muchii[NLIM];
int tati[NLIM], dis[NLIM];
bool viz[NLIM];
void citire(int &n, int &m) {
f >> n >> m;
for(int i=1; i<=n; i++) {
viz[i] = 0;
dis[i] = INT_MAX;
tati[i] = -1;
}
for(int i=1; i<=m; i++) {
int s, d, c;
f >> s >> d >> c;
Muchii[s].push_back(make_pair(d, c));
Muchii[d].push_back(make_pair(s, c));
}
}
void Prim(int start) {
Coada.push(make_pair(start, 0));
dis[start] = 0;
while(!Coada.empty()) {
int u = Coada.top().first;
Coada.pop();
viz[u] = 1;
for(int i=0; i<Muchii[u].size(); i++) {
int v = Muchii[u][i].first;
int c = Muchii[u][i].second;
if(!viz[v] && c < dis[v]) {
dis[v] = c;
Coada.push(make_pair(v, c));
tati[v] = u;
}
}
}
}
int main() {
int n, m;
citire(n, m);
Prim(1);
int sum = 0, count = 0;
for(int i=1; i<=n; i++) {
if(tati[i] != -1)
count += 1;
sum += dis[i];
}
g << sum << '\n' << count << '\n';
for(int i=1; i<=n; i++)
if(tati[i] != -1)
g << tati[i] << ' ' << i << '\n';
return 0;
}