Cod sursa(job #2148662)

Utilizator usureluflorianUsurelu Florian-Robert usureluflorian Data 1 martie 2018 21:16:02
Problema Radiatie Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
ifstream f ("radiatie.in");
ofstream g ("radiatie.out");
const int nmax=3e4+3;
vector <int> v[nmax];
vector <int> c[nmax];
int n,m,k,a,b,sol,GR[nmax],act,lvl[nmax],cost[nmax],boss[nmax];
struct usu
{
      int a,b,c;
}mu[nmax];
void root(int nod)
{
      for(int i=0;i<v[nod].size();++i)
      {
            if(lvl[v[nod][i]]) continue;
            lvl[v[nod][i]]=lvl[nod]+1;
            boss[v[nod][i]]=nod;
            cost[v[nod][i]]=c[nod][i];
            root(v[nod][i]);
      }
}
void dfs(int a,int b)
{
      while(a!=b)
      {
            if(lvl[a]>lvl[b])
            {
                  sol=max(sol,cost[a]);
                  a=boss[a];
            }
            else
            {
                  sol=max(sol,cost[b]);
                  b=boss[b];
            }
      }
}
inline bool cmp(const usu &t1,const usu &t2)
{
      return t1.c<t2.c;
}
inline int gr(int nod)
{
      if(GR[nod]==nod) return nod;
      GR[nod]=gr(GR[nod]);
      return GR[nod];
}
int main()
{
      f>>n>>m>>k;
      for(int i=1;i<=m;++i) f>>mu[i].a>>mu[i].b>>mu[i].c;
      sort(mu+1,mu+m+1,cmp);
      for(int i=1;i<=n;++i) GR[i]=i;
      for(int i=1;i<=m&&act<n-1;++i)
      {
            if(gr(mu[i].a)!=gr(mu[i].b))
            {
                  ++act;
                  v[mu[i].a].push_back(mu[i].b);
                  c[mu[i].a].push_back(mu[i].c);
                  v[mu[i].b].push_back(mu[i].a);
                  c[mu[i].b].push_back(mu[i].c);
                  GR[gr(mu[i].a)]=gr(mu[i].b);
            }
      }
      boss[1]=0;
      lvl[1]=1;
      root(1);
      while(k--)
      {
            f>>a>>b;
            sol=0;
            dfs(a,b);
            g<<sol<<'\n';
      }
      return 0;
}