Pagini recente » Cod sursa (job #1246110) | Cod sursa (job #1181091) | Cod sursa (job #190100) | Cod sursa (job #1399518) | Cod sursa (job #1435344)
#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;
}
};
void citire(),Kruskal(),afisare();
int N,M,Cost_grag;
Graf E[MMAX];
int Muchii[NMAX];
int Tata[NMAX];
int Inaltime[NMAX];
int gaseste_tata(int x) //ca sa stiu daca au acelasi tata
{
if(Tata[x]!=x)
Tata[x]=gaseste_tata(Tata[x]);
return Tata[x];
}
void adauga(int x,int y)//adauga o muchie la subgraful creat
{
if(Inaltime[x]<Inaltime[y])
{
Tata[x]=y;
return;
}
if(Inaltime[x]>Inaltime[y])
{
Tata[y]=x;
return;
}
Tata[x]=y;
Inaltime[y]++;
}
int main()
{
citire();
Kruskal();
afisare();
return 0;
}
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(gaseste_tata(x)==gaseste_tata(y))
continue;
adauga(gaseste_tata(x),gaseste_tata(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]].x<<" "<<E[Muchii[i]].y<<endl;
}
}