Pagini recente » Cod sursa (job #1576565) | Cod sursa (job #1028803) | Cod sursa (job #1939029) | Cod sursa (job #2930832) | Cod sursa (job #2174182)
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
struct edge{
int cost,edge1,edge2;
};
bool cmp(edge a , edge b)
{
return a.cost<b.cost;
}
const int NLim=200002;
const int MLim=400004;
int n,m;
int disjoint[NLim],sol1[NLim],sol2[NLim],p=1,sum=0;
edge v[MLim];
void citire()
{
fin>>n>>m;
for(int i=1;i<=m;i++)
{
disjoint[i]=i;
fin>>v[i].edge1>>v[i].edge2>>v[i].cost;
}
}
int father(int x)
{
if(disjoint[x]==x)
return x;
disjoint[x]=father(disjoint[x]);
return disjoint[x];
}
void unite(int x, int y)
{
if(rand()%2==0)
disjoint[father(x)]=father(y);
else
disjoint[father(y)]=father(x);
}
void rezolva()
{
sort(v+1,v+m+1,cmp);
for(int i=1;i<=m;i++)
{
int node1=v[i].edge1;
int node2=v[i].edge2;
int fnode1=father(node1);
int fnode2=father(node2);
if(fnode1!=fnode2)
{
unite(fnode1,fnode2);
sol1[p]=node1;
sol2[p]=node2;
sum+=v[i].cost;
p++;
}
}
}
void afis()
{
fout<<sum<<"\n"<<p-1<<"\n";
for(int i=1;i<p;i++)
{
fout<<sol2[i]<<" "<<sol1[i]<<"\n";
}
}
int main()
{
citire();
rezolva();
afis();
return 0;
}