Pagini recente » Cod sursa (job #3278281) | Cod sursa (job #3275774) | Cod sursa (job #3275204) | Flux si cuplaj | Cod sursa (job #3286911)
#include <bits/stdc++.h>
using namespace std;
struct muchie
{
int i, j, cost;
};
int n, m;
vector<muchie>drum;
vector<int>parent;
vector<int>rnk;
int find_set(int a)
{
if(parent[a] != a)
parent[a] = find_set(parent[a]);
return parent[a];
}
void union_set(int a, int b)
{
a = find_set(a);
b = find_set(b);
if(a != b)
{
if(rnk[a] < rnk[b])
swap(a,b);
parent[b] = a;
if(rnk[a] == rnk[b])
rnk[a]++;
}
}
int main()
{
ifstream fin("apm.in");
ofstream fout("apm.out");
int x, i, j, c;
fin >>n>>m;
parent.resize(n+1);
rnk.resize(n+1);
for(x = 0; x < m; x++)
{
fin >>i>>j>>c;
drum.push_back({i,j,c});
}
sort(drum.begin(),drum.end(),[](const muchie &a, const muchie &b)
{
return a.cost < b.cost;
});
for(i = 1; i <= n; i++)
{
parent[i] = i;
rnk[i] = 0;
}
int S = 0;
vector<pair<int,int>>muchii_alese;
for(x = 0; x < m; x++)
{
if(find_set(drum[x].i) != find_set(drum[x].j))
{
S += drum[x].cost;
muchii_alese.push_back({drum[x].j,drum[x].i});
union_set(drum[x].i,drum[x].j);
}
}
cout <<S<<"\n"<<muchii_alese.size()<<"\n";
for(auto &edge:muchii_alese)
{
cout <<edge.first<<" "<<edge.second<<"\n";
}
return 0;
}