Cod sursa(job #2491201)

Utilizator DanutAldeaDanut Aldea DanutAldea Data 12 noiembrie 2019 00:16:04
Problema Radiatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.44 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <iostream>
#include <bitset>
#define dim 15010
using namespace std;

ifstream fin("radiatie.in");
ofstream fout("radiatie.out");

int n,m,T,k,i,j,q,x,y,rx,ry,t[dim],E[2*dim],N[2*dim],P[2*dim],F[dim];
vector <pair<int,int> > l[dim];
int D[16][2*dim];
int dist[2*dim];
bitset <2*dim> f;

struct muchii{
    int x;
    int y;
    int c;
} v[2*dim];

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

int rad(int x){
    while(t[x]>0)
        x=t[x];
    return x;
}

void upd(int x, int rx){
    int y;
    while(t[x]>0){
        y=t[x];
        t[x]=rx;
        x=y;
    }
}

void dfs(int nod,int niv){
    f[nod]=1;

    E[++k]=nod;
    N[k]=niv;
    F[nod]=k;

    for(int i=0;i<l[nod].size();i++){
        int vec=l[nod][i].first;
        int cost=l[nod][i].second;

        if(!f[vec]){
            dist[vec]=dist[nod]+cost;

            dfs(vec,niv+1);

            E[++k]=nod;
            N[k]=niv;
        }
    }
}

int main(){
    fin>>n>>m>>T;
    for(q=1;q<=m;q++)
        fin>>v[q].x>>v[q].y>>v[q].c;
    sort(v+1,v+m+1,cmp);

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

    for(q=1;q<=m;q++){
        x=v[q].x; y=v[q].y;
        rx=rad(x); upd(x,rx);
        ry=rad(y); upd(y,ry);

        if(rx!=ry){
            if(t[rx]<t[ry]){
                t[rx]+=t[ry];
                t[ry]=rx;
            }else{
                t[ry]+=t[rx];
                t[rx]=ry;
            }

            cout<<x<<" "<<y<<" "<<v[q].c<<"\n";
            l[x].push_back(make_pair(y,v[q].c));
            l[y].push_back(make_pair(x,v[q].c));
        }
    }

    dfs(1,1);

    for(i=1;i<=k;i++){
        P[i]=1+P[i/2];
        D[0][i]=i;
    }

    for(i=1;i<=P[k];i++){
        for(j=1;j<=k;j++){
            D[i][j]=D[i-1][j];

            if( j+(1<<(i-1))<=k && N[ D[i][j] ]>N[ D[i-1][j+(1<<(i-1))]] )
                D[i][j]=D[i-1][j+(1<<(i-1))];
        }
    }

    for(;T;T--){
        fin>>i>>j;
        x=F[i]; y=F[j];

        if(x>y)
            swap(x,y);

        q=P[y-x+1];

        if(N[ D[q][x] ] < N[ D[q][y-(1<<q)+1] ]){
            cout<<E[D[q][x]]<<"\n";
            fout<<dist[i]-dist[E[D[q][x]]]+dist[j]-dist[E[D[q][x]]]<<"\n";

        }else{
            fout<<dist[i]-dist[E[D[q][y-(1<<q)+1]]]+dist[j]-dist[E[D[q][y-(1<<q)+1]]]<<"\n";
        }
    }

    return 0;
}