Pagini recente » Cod sursa (job #674787) | Cod sursa (job #1900290) | Cod sursa (job #1900274) | Cod sursa (job #2298283) | Cod sursa (job #2423005)
#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>
std::ifstream fin("apm.in");
std::ofstream fout("apm.out");
struct Muchii
{
int cost,a,b;
};
bool cmp(Muchii a,Muchii b)
{
return a.cost<b.cost;
}
int gaseste_reprezentant(std::vector<int>&reprezentant,int nod)
{
if(reprezentant[nod]==nod)
return nod;
reprezentant[nod]=gaseste_reprezentant(reprezentant,reprezentant[nod]);
return reprezentant[nod];
}
std::vector<Muchii> kruskal(std::vector<Muchii>&muchii,int n,int m)
{
std::vector<Muchii> arbore;
sort(muchii.begin(), muchii.end(),cmp);
std::vector<int> culoare(n+1);
std::vector<int> reprezentant(n+1);
int total=0;
for (int i = 1; i < n+1; ++i)
{
culoare[i]=i;
reprezentant[i]=i;
}
for (auto muchie:muchii)
{
int ra=gaseste_reprezentant(reprezentant,muchie.a);
int rb=gaseste_reprezentant(reprezentant,muchie.b);
if(culoare[ra]!=culoare[rb])
{
total+=muchie.cost;
reprezentant[ra]=rb;
arbore.push_back(muchie);
}
}
fout<<total<<'\n';
return arbore;
}
int main(int argc, char const *argv[])
{
int n,m;
fin>>n>>m;
std::vector<Muchii> muchii;
for (int i = 0; i < m; ++i)
{
Muchii muchie;
fin>>muchie.a>>muchie.b>>muchie.cost;
muchii.push_back(muchie);
}
std::vector<Muchii> arbore=kruskal(muchii,n,m);
fout<<n-1<<'\n';
for (auto muchie:arbore)
{
fout<<muchie.a<<' '<<muchie.b<<'\n';
}
fin.close();
fout.close();
}