Pagini recente » Cod sursa (job #2768639) | Cod sursa (job #1016713) | Cod sursa (job #2485313) | Cod sursa (job #857090) | Cod sursa (job #1613931)
#include <cstdio>
#include <vector>
#include <queue>
#define nmax 200001
using namespace std;
FILE *f=fopen("apm.in","r"),*g=fopen("apm.out","w");
struct muc{
int x,y,c;
}v[nmax],rasp[nmax];
struct cmp{
bool operator()(int x, int y)
{
return v[x].c>v[y].c;
}
};
priority_queue <int, vector <int>,cmp> h;
int n,m,t[nmax],r[nmax],k,s;
int finds(int x)
{
int r,i;
for(i=x;i!=t[i];i=t[i]);
while(x!=t[x])
{
r=t[x];
t[x]=i;
x=r;
}
return i;
}
void unire(int x, int y)
{
if(r[x]>r[y])
t[y]=x;
else t[x]=y;
if(r[x]==r[y])
r[y]++;
}
int main()
{
int i,j,x; muc aux;
fscanf(f,"%d %d",&n,&m);
for(i=1;i<=m;i++)
{
fscanf(f,"%d %d %d",&v[i].x,&v[i].y,&v[i].c);
h.push(i);
}
for(i=1;i<=n;i++)
{
t[i]=i;
r[i]=0;
}
while(k<n-1)
{
x=h.top(); h.pop();
i=finds(v[x].x);
j=finds(v[x].y);
if(i!=j)
{
unire(i,j);
s+=v[x].c;
rasp[++k]=v[x];
}
}
fprintf(g,"%d\n",s);
fprintf(g,"%d\n",k);
for(i=1;i<=k;i++)
fprintf(g,"%d %d\n",rasp[i].y,rasp[i].x);
fclose(f);
fclose(g);
return 0;
}