Pagini recente » Cod sursa (job #2673631) | Cod sursa (job #1844201) | Cod sursa (job #290930) | Cod sursa (job #188725) | Cod sursa (job #2487752)
#include <fstream>
#include <algorithm>
#define NMAX 105
#define MMAX 5005
using namespace std;
ifstream fin("kruskal.in");
ofstream fout("kruskal.out");
struct muchie
{
int x, y, c;
} a[MMAX];
int n, m, c[NMAX];
int t[NMAX];
void read();
void kruskal();
void write();
bool comp(muchie a, muchie b)
{
return a.c < b.c;
}
// algoritmul Kruskal se bazeaza pe metoda Greedy si are o complexitate de n^2 + m^2
int main()
{
read();
sort(a + 1, a + 1 + m, comp);
kruskal();
write();
return 0;
}
void read()
{
int i;
fin >> n >> m;
for (i = 1; i <= m; i++)
fin >> a[i].x >> a[i].y >> a[i].c;
for (i = 1; i <= n; i++)
c[i] = i;
}
void kruskal()
{
int nr, small, big, i, j;
for (i = 1, nr = 1; nr <= n - 1; i++)
if (c[a[i].x] != c[a[i].y])
{
t[nr++] = i; //selectez muchia i
// unific componentele conexe
small = c[a[i].x]; big = c[a[i].y];
if (small > big)
swap(small, big);
for (j = 1; j <= n; j++)
if (c[j] == big)
c[j] = small;
}
}
void write()
{
int i, cost;
for (i = 1, cost = 0; i <= n - 1; i++)
cost += a[t[i]].c;
fout << cost << '\n';
for (i = 1; i <= n - 1; i++)
fout << a[t[i]].x << ' ' << a[t[i]].y << '\n';
}