Cod sursa(job #1297387)

Utilizator RaduGabriel2012Dinu Radu RaduGabriel2012 Data 21 decembrie 2014 22:52:03
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
ifstream f("transport2.in");
ofstream g("transport2.out");



  int n,m,dad[100005],x[200005],y[200005],cost[200005],d[100005],ord[200005],cmax,hmax[100005];

bool comp(int a,int b)
{ return cost[a]<cost[b];}

int Grupa(int x)
{ int i,k=0;

  while(x!=dad[x])
  { k++; d[k]=x;
    x=dad[x];
  }

   hmax[x]=max(hmax[x],k);

  for(i=1;i<=k;i++)
   dad[d[i]]=x;

 return x;
}
int main()
{ int i,ind,gr1,gr2;
    f>>n>>m;

    for(i=1;i<=n;i++)
     dad[i]=i;

    for(i=1;i<=m;i++)
    { f>>x[i]>>y[i]>>cost[i];
       cmax=max(cmax,cost[i]);
      ord[i]=i;
    }

  sort(ord+1,ord+m+1,comp);

//  for(i=1;i<=m;i++)
  // cout<<x[ord[i]]<<" "<<y[ord[i]]<<" "<<cost[ord[i]]<<"\n";
     ind=m+1;
   for(i=cmax;i>=1;i--)
   {
      while(ind-1>=1 && cost[ord[ind-1]]>=i)
      { ind--;
          gr1=Grupa(x[ord[ind]]); gr2=Grupa(y[ord[ind]]);
        if (hmax[gr1]<hmax[gr2]) dad[gr1]=gr2; else dad[gr2]=gr1;
      }

    if (Grupa(1)==Grupa(n)) break;
   }

   g<<i;
    return 0;
}