Pagini recente » Cod sursa (job #589815) | Cod sursa (job #2913892) | Cod sursa (job #2264233) | Cod sursa (job #17981) | Cod sursa (job #930971)
Cod sursa(job #930971)
#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;
}