Cod sursa(job #3336496)

Utilizator dominiqqTirdea Dominic Alexandru dominiqq Data 24 ianuarie 2026 20:10:24
Problema Arbore partial de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include<iostream>
#include<fstream>
#include<algorithm>
#include<vector>
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");

struct Muchie  {
  int x,y,c;
};
int n,m;

bool cmp(const Muchie& a, const Muchie& b) {
    return a.c < b.c;
}

int reprezentant(int u, vector<int>& tati){
  if(tati[u] == u){
    return u;
  }
  tati[u] = reprezentant(tati[u], tati);
  return tati[u];
}

bool renuniune(int u, int v, vector<int>& tati, vector<int>& reprezentanti, vector<int>& inaltimi){
  int ru = reprezentant(u, tati);
  int rv = reprezentant(v, tati);
  if(ru == rv){
    return false;
  }
  if(inaltimi[ru] >= inaltimi[rv]){
    tati[rv] = ru;
    for(int i = 0; i < n; i++){
      if (reprezentanti[i] == rv){
        reprezentanti[i] = ru;
      }
    }
    if(inaltimi[ru] == inaltimi[rv]){
      inaltimi[ru]++;
    }
  }else{
    tati[ru] = tati[rv];
    for(int i = 0; i < n; i++){
      if (reprezentanti[i] == ru){
        reprezentanti[i] = rv;
      }
    }
  }
  return true;
}

int main(){
  fin>>n>>m;
  vector<Muchie> muchii;
  vector<Muchie> muchii_arbore;
  vector<int> tati(n, -1);
  vector<int> reprezentanti(n,0);
  vector<int> inaltimi(n,0);
  for(int i = 0; i < m; i++){
    int x,y,c;
    fin>>x>>y>>c;
    muchii.push_back({x-1,y-1,c});
  }
  sort(muchii.begin(), muchii.end(), cmp);
  for(int i = 0; i < n; i++){
    reprezentanti[i] = i;
    tati[i] = i;
  }
  int nrMuchii = 0;
  while(nrMuchii < n-1 && muchii.size() > 0){
    if(renuniune(muchii[0].x, muchii[0].y, tati, reprezentanti, inaltimi)){
      muchii_arbore.push_back(muchii[0]);
      nrMuchii++;
    }
    muchii.erase(muchii.begin());
  }
  for(auto v : muchii_arbore){
    fout<<v.x+1<<" "<<v.y+1<<endl;
  }

  return 0;
}