Cod sursa(job #1226998)

Utilizator Adrian1997Radulescu Adrian Adrian1997 Data 9 septembrie 2014 11:53:50
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.59 kb
#include <fstream>
#include <list>
#include <vector>
#include <bitset>
#include <algorithm>
#define DIM 15011
using namespace std;
ifstream f("radiatie.in");
ofstream g("radiatie.out");
int n,m,k,nr;
int F[DIM],A[16][2*DIM],B[16][2*DIM],C[2*DIM],p[2*DIM];
pair<int,int>  E[2*DIM];

struct tip{
    int a,b,c;
};

list<pair<int,int> > L[DIM];
vector<tip> v;
vector<int> T;
bitset<DIM> viz;

int cmp(tip x,tip y){
   return(x.c<y.c);
}

inline int rad(int x){
    int y=x,aux;
    while(T[x]>0) x=T[x];
    while(T[y]>0) aux=T[y],T[y]=x,y=aux;
    return x;
}

void dfs(int nod,int niv){
    list<pair<int,int> >::iterator it;
    viz[nod]=1;
    E[++nr]=make_pair(nod,niv);
    if(!F[nod]) F[nod]=nr;
    for(it=L[nod].begin();it!=L[nod].end();it++)
        if(!viz[it->first]){
            C[nr+1]=it->second;
            dfs(it->first,niv+1),E[++nr]=make_pair(nod,niv);
            C[nr]=it->second;
        }
}

inline int LCA(int x,int y){
    int b;
    x=F[x],y=F[y];
    if(x>y) b=y,y=x,x=b;
    b=p[y-x+1];
    y=(y-(1<<b))+1;
    if(E[A[b][x]].second<E[A[b][y]].second)
        return E[A[b][x]].first;
    return E[A[b][y]].first;
}

inline int muchie(int x,int y){
    int b;
    x=F[x],y=F[y];
    if(x>y) b=x,x=y,y=b;
    b=p[y-x+1];
    y=(y-(1<<(b-1)))+1;
    if(C[B[b][x+1]]>C[B[b][y]])
        return C[B[b][x+1]];
    return C[B[b][y]];
}

int main(void){
    register int i,j,jv,cost=0,x,y,z;
    tip q;
    vector<tip>::iterator it;

    f>>n>>m>>k;
    for(i=1;i<=m;i++)
        f>>q.a>>q.b>>q.c,v.push_back(q);
    for(i=1;i<=n+1;i++) T.push_back(-1);
    sort(v.begin(),v.end(),cmp);
    for(it=v.begin();it!=v.end();it++){
        x=rad(it->a),y=rad(it->b);
        if(x!=y){
            if(T[x]<T[y])
                T[x]+=T[y],T[y]=x;
            else
                T[y]+=T[x],T[x]=y;
            L[it->a].push_back(make_pair(it->b,it->c));
            L[it->b].push_back(make_pair(it->a,it->c));
        }
    }
    dfs(1,0);
    p[1]=0,A[0][1]=1,B[0][1]=1;
    for(i=2;i<=nr;i++) p[i]=p[i/2]+1,A[0][i]=i,B[0][i]=i;
    for(i=1;(1<<i)<=nr;i++){
        for(j=1;j<=nr;j++){
            A[i][j]=A[i-1][j],jv=(1<<(i-1))+j;
            if(jv<=nr && E[A[i][j]].second>E[A[i-1][jv]].second)
                A[i][j]=A[i-1][jv];
            B[i][j]=B[i-1][j];
            if(jv<=nr && C[B[i-1][j]]<C[B[i-1][jv]])
                B[i][j]=B[i-1][jv];
        }
    }

    for(i=1;i<=k;i++){
        f>>x>>y;
        z=LCA(x,y);
        g<<max(muchie(x,z),muchie(z,y))<<"\n";
    }
    f.close();
    g.close();
    return 0;
}