Pagini recente » Cod sursa (job #611767) | Cod sursa (job #464967) | Cod sursa (job #802334) | Cod sursa (job #34745) | Cod sursa (job #1435345)
#include <iostream>
#include <algorithm>
#include<fstream>
using namespace std;
const int NMAX=200001;
const int MMAX=400001;
struct Graf
{
int x,y,c;
void initializare(int _x,int _y,int _c)
{
x= _x;
y= _y;
c= _c;
}
bool operator()(const Graf &A,const Graf &B)
{
return A.c < B.c;
}
};
int N,M,Cost_grag;
Graf E[MMAX];
int Muchii[NMAX];
int Tata[NMAX];
int lung[NMAX];
int inloc(int x) //ca sa stiu daca au acelasi tata
{
if(Tata[x]!=x)
Tata[x]=inloc(Tata[x]);
return Tata[x];
}
void adauga(int x,int y)//adauga o muchie la subgraful creat
{
if(lung[x]<lung[y])
{
Tata[x]=y;
return;
}
if(lung[x]>lung[y])
{
Tata[y]=x;
return;
}
Tata[x]=y;
lung[y]++;
}
void citire()
{
int x,y,c;
ifstream f("apm.in");
f>>N>>M;
for(int i=1;i<=M;i++)
{
f>>x>>y>>c;
E[i].initializare(x,y,c);
}
}
void Kruskal()
{
int i,j,x,y,c;
sort(E+1,E+M+1,Graf());
for(i=1;i<=N;i++)
Tata[i]=i;
for(i=1,j=0;i<=M && j<=N-1;i++)
{
x=E[i].x;
y=E[i].y;
c=E[i].c;
if(inloc(x)==inloc(y))
continue;
adauga(inloc(x),inloc(y));
Cost_grag+=c;
Muchii[++j]=i;
}
}
void afisare()
{
ofstream g("apm.out");
g<<Cost_grag<<" "<<N-1<<endl;
for(int i=1;i<=N-1;i++)
{
g<<E[Muchii[i]].y<<" "<<E[Muchii[i]].x<<endl;
}
}
int main()
{
citire();
Kruskal();
afisare();
return 0;
}