Cod sursa(job #1338178)

Utilizator bogdanboboc97Bogdan Boboc bogdanboboc97 Data 9 februarie 2015 20:44:36
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("kruskal.in");
ofstream out("kruskal.out");
priority_queue< pair< int , pair<int,int> > > q;
vector<int> t,h;
vector< pair<int,int> > sol;
int n,ct;
void unite(int x,int y)
{
    if(h[x]>h[y])t[y]=x;
    else t[x]=y;
    if(h[x]==h[y])h[y]++;
}
int rad(int x)
{
    int r,y;
    for(r=x;t[r]!=r;r=t[r]);
    while(t[x]!=x)
    {
        y=t[x];
        t[x]=r;
        x=y;
    }
    return r;
}
void kruskal()
{
    for(int i=1;i<=n;i++)t[i]=i;
    int sel=0;
    while(sel<n-1)
    {
        int cost=-q.top().first,x=q.top().second.first,y=q.top().second.second;
        q.pop();
        sol.push_back(make_pair(x,y));
        x=rad(x);y=rad(y);
        if(x!=y)
        {
            ct+=cost;
            unite(x,y);
            sel++;
        }
    }
}
int main()
{
    int m,x,y,z;
    in>>n>>m;
    t=h=vector<int>(n+1);
    for(;m;m--)
    {
        in>>x>>y>>z;
        q.push(make_pair(-z,make_pair(x,y)));
    }
    kruskal();
    out<<ct<<'\n'<<n-1<<'\n';
    for(int i=0;i<n-1;i++)out<<sol[i].first<<' '<<sol[i].second<<'\n';
    return 0;
}