Pagini recente » Cod sursa (job #1296561) | Cod sursa (job #791829) | Cod sursa (job #1743966) | Cod sursa (job #1144268) | Cod sursa (job #3193579)
#include <bits/stdc++.h>
using namespace std;
const string file_name = "coborare";
ifstream fin("apm.in");
ofstream fout("apm.out");
const int NMAX = 100000;
const int Mod = 100003;
int T[NMAX];
int rang[NMAX];
int C[NMAX];
int N,M;
vector<int> G[NMAX];
struct Muchie{
int x,y,cost;
}Muchii[NMAX];
int cmin;
int find_rep(int k)
{
if(T[k]!=k)
{
int x = find_rep(T[k]);
T[k] = x;
return x;
}
return k;
}
void Union(int rp, int rk)
{
if(rk!=rp)
{
if(rang[rk]>rang[rp])
{
T[rp] = rk;
}
else
{
T[rk]=rp; //rp e tatal lui rk
if(rang[rk]==rang[rp])
rang[rp]++; //rangul = gradul tatalui creste cu 1
}
}
}
//Dijkstra - bfs pentru cel mai mic drum de la un nod selectat la toate celelalte noduri, adaugam in PQ nodul cu - pt. sortare -> min heap //
//Kruskal
vector<Muchie> apm;
void citire()
{
fin>>N>>M;
for(int i=1;i<=M;i++)
{
fin>>Muchii[i].x>>Muchii[i].y>>Muchii[i].cost;
}
}
int i;
int main()
{
fin>>N>>M;
int x,y;
citire();
for(i=1;i<=N;i++)
{
T[i] = i;
rang[i] = 1;
}
sort(Muchii+1,Muchii+1+M, [](Muchie m1, Muchie m2)
{
return m1.cost<m2.cost;
});
int nr_muchii = 0;
for(int i=0; i<M && nr_muchii < N-1; i++)
{
int repr_x = find_rep(Muchii[i].x);
int repr_y = find_rep(Muchii[i].y);
if(repr_x != repr_y) //verificam daca 2 reprezentanti nu sunt uniti
{
nr_muchii++; //adaugam la nr de muchii
cmin+=Muchii[i].cost; //adaugam costul Muchiei i la total
apm.push_back(Muchii[i]); //adaugam muchia in APM
Union(repr_y, repr_x); //unim arborii reprezentantilor
}
}
fout<<cmin<<'\n';
fout<<nr_muchii<<'\n';
for(Muchie edge: apm)
{
fout<<edge.x<<" "<<edge.y<<" "<<edge.cost<<'\n';
}
}