Cod sursa(job #3150067)

Utilizator alexdmnDamian Alexandru alexdmn Data 14 septembrie 2023 17:35:01
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>
#include <queue>
#include <algorithm>

using namespace std;
int f[200005], mar[200005];

int father(int x)
{
	if(f[x]==x) return x;
	else return father(f[x]);
}

int marime(int x)
{
	x=father(x);
	return mar[x];
}

int join(int x, int y)
{
	x=father(x);
	y=father(y);

	if(x==y)
		return 0;

	if(mar[x]>mar[y])
	{
		mar[x]+=mar[y];
		f[y]=x;
	}
	else
	{
		mar[y]+=mar[x];
		f[x]=y;
	}

	return 0;
}

bool verif(int x, int y)
{
	x=father(x);
	y=father(y);

	if(x==y)
		return 1;
	return 0;
}

struct muchie
{
	int a, b, cost;
};

int cmp(muchie x, muchie y)
{
	return x.cost<y.cost;
}

queue < pair< int, int > > q;
muchie v[400005];

int main()
{
		ifstream cin("apm.in");
		ofstream cout("apm.out");

		int n, m, costt=0, cnt=0;
		cin>>n>>m;
		for(int i=0;i<=n;i++)
		{
			f[i]=i;
			mar[i]=1;
		}

		for(int i=0;i<m;i++)
		{
			cin>>v[i].a>>v[i].b>>v[i].cost;
		}

		sort(v, v+m, cmp);

		for(int i=0;i<m;i++)
		{
			if(verif(v[i].a, v[i].b)==0)
			{
				costt+=v[i].cost;
        join(v[i].a, v[i].b);
        cnt++;
        q.push({v[i].a, v[i].b});
			}
		}

		cout<<costt<<'\n'<<cnt<<'\n';

		while(!q.empty())
		{
			cout<<q.front().first<<" "<<q.front().second<<'\n';
			q.pop();
		}

    return 0;
}