Cod sursa(job #930971)

Utilizator HypherionRobert Mandache Hypherion Data 27 martie 2013 22:05:29
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;
#define MAX 100
class muchie
{
public:
	int nod1,nod2,cost;
	int operator<(muchie e)
	{
		if(cost<e.cost) return 1;
		return 0;
	}
};
ifstream in("kruskal.in");
ofstream out("kruskal.out");
int parent[MAX],h[MAX],n,m;
void MakeSet(int u)
{
	parent[u]=0;
	h[u]=1;
}
int FindSet(int u)
{
	if(parent[u]==0)
		return u;
	else 
	{
			parent[u]=FindSet(parent[u]);
			return parent[u];
	}
}
void Union(int u,int v)
{
	int x=FindSet(u);
	int y=FindSet(v);
	if(h[x]<h[y]) parent[x]=y;
	else 
	{
		parent[y]=x;
		if(h[x]==h[x]) 
			h[x]++;
	}
}
void Kruskal(vector<muchie> edge)
{
	for (int i=1;i<=m;i++)
		MakeSet(i);
	sort(edge.begin(),edge.end());
	//edge_sort();
	int i=1,cost_minim=0;
	while(i<=n+1)
	{
		int u=edge[i].nod1;
		int v=edge[i].nod2;
		if(FindSet(u)!=FindSet(v))
		{
			out<<u<<" "<<v<<endl;
			cost_minim+=edge[i].cost;
			Union(u,v);
		}
		i++;
	}
	out<<cost_minim;
}
int main()
{ 
	in>>n>>m;
	vector<muchie> edge(m+1);
	for(int i=1;i<=m;i++)
		in>>edge[i].nod1>>edge[i].nod2>>edge[i].cost;
	in.close();
	Kruskal(edge);
	out.close();
	return 0;
}