Pagini recente » Cod sursa (job #1901886) | Cod sursa (job #1868689) | Cod sursa (job #2792970) | Cod sursa (job #2652023) | Cod sursa (job #2282299)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin ("apm.in");
ofstream fout("apm.out");
const int MAX_N = 200000 + 16;
const int MAX_M = 400000 + 16;
int N, M;
struct edge
{
int a, b, c;
} Edges[MAX_M];
pair < int, int > sol[MAX_N];
int K;
int Father[MAX_N], Rank[MAX_N];
bool cmp(edge X, edge Y)
{
if(X.c == Y.c) return X.a < Y.a;
return X.c < Y.c;
}
int forest_find(int);
void forest_unite(int, int);
int main()
{
fin >> N >> M;
for(int i = 1; i <= M; ++i)
{
fin >> Edges[i].a >> Edges[i].b >> Edges[i].c;
if(Edges[i].a > Edges[i].b)
swap(Edges[i].a, Edges[i].b);
}
sort(Edges + 1, Edges + M + 1, cmp);
for(int i = 1; i <= N; ++i)
{
Father[i] = i;
Rank[i] = 1;
}
int cost_arb = 0;
int i = 1;
while(K < N - 1 && i <= M)
{
int x = forest_find(Edges[i].a);
int y = forest_find(Edges[i].b);
if(x != y)
{
forest_unite(x, y);
sol[++K] = make_pair(Edges[i].a, Edges[i].b);
cost_arb += Edges[i].c;
}
i++;
}
fout << cost_arb << '\n';
for(int i = 1; i <= K; ++i)
fout << sol[i].first << ' ' << sol[i].second << '\n';
return 0;
}
void forest_unite(int x, int y)
{
if(Rank[x] <= Rank[y])
Father[x] = y;
else
Father[y] = x;
if(Rank[x] == Rank[y])
Rank[y]++;
}
int forest_find(int x)
{
int R;
for(R = x; R != Father[R]; R = Father[R]);
Father[x] = R;
while(x != R)
{
int next = Father[x];
Father[x] = R;
x = next;
}
return R;
}