Pagini recente » Cod sursa (job #1216613) | Cod sursa (job #2849090) | Cod sursa (job #1592297) | Cod sursa (job #2828083) | Cod sursa (job #2173708)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <set>
#include <queue>
/// Implementare Prim
using namespace std;
const int NMAX = 200002;
const int MMAX = 400004;
ifstream in("apm.in");
ofstream out("apm.out");
struct edge
{
int cost,edge1,edge2;
} v[MMAX];
bool cmp(edge a,edge b)
{
return a.cost<b.cost;
}
int n,m,p=1,sum=0;
int sol1[NMAX],sol2[NMAX];
int disjoint[NMAX];
void citeste()
{
in>>n>>m;
for(int i=1; i<=m; i++)
{
disjoint[i]=i;
int x,y,cost;
in>>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()
{
out<<sum<<'\n'<<p-1<<'\n';
for(int i=1;i<p;i++)
{
out<<sol2[i]<<" "<<sol1[i]<<'\n';
}
}
int main()
{
citeste();
rezolva();
afis();
}