Cod sursa(job #2011776)

Utilizator lflorin29Florin Laiu lflorin29 Data 17 august 2017 09:58:49
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <bits/stdc++.h>

using namespace std;

const int N=15003;
int n,m,k;
vector<vector<int>>edges;
vector<pair<int,int>>g[N];
int dsuft[N],treeft[15][N],mxedge[15][N],viz[N],dep[N];
int get(int x) {
  if(x==dsuft[x])return x;
  return dsuft[x]=get(dsuft[x]);
}
void join(int a,int b, int c) {
  dsuft[get(a)] = get(b);
  g[a].emplace_back(b, c);
  g[b].emplace_back(a, c);
}
void dfs(int nod) {
  if(treeft[0][nod]==0)dep[nod]=1;
  else dep[nod]=dep[treeft[0][nod]]+1;
  for(int i=1; i<=14; ++i) {
    treeft[i][nod]=treeft[i-1][treeft[i-1][nod]];
    mxedge[i][nod]=max(mxedge[i-1][nod],mxedge[i-1][treeft[i-1][nod]]);
  }
  viz[nod]=1;
  for(auto itr:g[nod]) {
    if(itr.first==treeft[0][nod])continue;
    treeft[0][itr.first]=nod;
    mxedge[0][itr.first]=itr.second;
    dfs(itr.first);
  }
}
void initdsu(int len) {
  for(int i=1; i<=len; ++i)dsuft[i]=i;
}
int qry(int a,int b) {
  if(dep[a]<dep[b])swap(a,b);
  int mx=0;
  for(int i=14; i>=0; --i) {
    if(dep[a]-(1<<i)>=dep[b]) {
      mx=max(mx,mxedge[i][a]);
      a=treeft[i][a];
    }
  }
  if(a==b)return mx;
  for(int i=14; i>=0; --i) {
    if(treeft[i][a]&&treeft[i][b]&&
        treeft[i][a]!=treeft[i][b]) {
      mx = max(mx, mxedge[i][a]);
      mx = max(mx, mxedge[i][b]);
      a = treeft[i][a];
      b = treeft[i][b];
    }
  }
  mx = max(mx, mxedge[0][a]); mx = max(mx, mxedge[0][b]);
  return mx;
}
int main() {
  ifstream cin("radiatie.in");
  ofstream cout("radiatie.out");
  cin>>n>>m>>k;
  initdsu(n);
  edges.resize(m);
  for(int i=0; i<m; ++i) {
    edges[i].resize(3);
    cin>>edges[i][1]>>edges[i][2]>>edges[i][0];
  }
  sort(edges.begin(),edges.end());
  for(auto itr:edges) {
    if(get(itr[1])!=get(itr[2]))join(itr[1],itr[2],itr[0]);
  }
  for(int i=1; i<=n; ++i)if(!viz[i])dfs(i);
  for(int i=1; i<=k; ++i) {
    int a,b;
    cin>>a>>b;
    cout<<qry(a,b)<<'\n';
  }
  return 0;
}