Cod sursa(job #2430800)

Utilizator TudorChirila11Tudor Chirila TudorChirila11 Data 16 iunie 2019 15:17:58
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <bits/stdc++.h>
#define st first
#define nd second
#define pb push_back
using namespace std;
int n, m, i, j, care[200006], x, y, p, sum;
priority_queue <pair <int,pair <int,int> > > pq;
vector <int> v[200006];
vector <pair<int,int> > ans;
void unite(int m1, int m2)
{
    for(int i=v[m2].size()-1;i>=0;i--)
    {
        care[v[m2][i]]=m1;
        v[m1].pb(v[m2][i]);
        v[m2].pop_back();
    }
}
int main()
{
    freopen("apm.in","r",stdin);
    freopen("apm.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++)
        {
            scanf("%d%d%d",&x,&y,&p);
            pq.push({-p,{x,y}});
        }
    for(i=1;i<=n;i++)
        {
            v[i].pb(i);
            care[i]=i;
        }
    while(!pq.empty())
    {
        pair <int,pair <int,int> > it=pq.top();
        pq.pop();
        int m1=care[it.nd.st], m2=care[it.nd.nd];
        if(m1!=m2)
        {
            ans.pb({it.nd.st,it.nd.nd});
            sum+=it.st*-1;
            if(v[m1].size()>v[m2].size())
                unite(m1,m2);
            else unite(m2,m1);
        }
    }
    printf("%d\n%d\n",sum,ans.size());
    for(i=0;i<ans.size();i++)
        printf("%d %d\n",ans[i].st,ans[i].nd);
    return 0;
}