Cod sursa(job #1826951)

Utilizator DevilOnFieldTudor Horia Niculescu DevilOnField Data 11 decembrie 2016 11:02:28
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.87 kb
#include<stdio.h>
#include<vector>
#include<algorithm>

#define MAXIMM 30005
#define MAXN 15005
#define LOGBA 20

using namespace std;

FILE *in, *out;

struct muchie
{
    int a, b, val;
};

struct nozi
{
    int catre, cost;
};


muchie trare[MAXIMM];
int cap[MAXN], dpt[MAXN], n, m, k;
vector <nozi> g[MAXN];
char viz[MAXN];
nozi tatici[LOGBA + 1][MAXN];

int gase(int elem)
{
    if(cap[elem] != elem) {
        elem = gase(cap[elem]);
    }
    return elem;
}

void unesc(int a, int b)
{
    a = gase(a);
    b = gase(b);
    if(dpt[a] > dpt[b]) {
            cap[b] = a;
    } else {
        cap[a] = b;
        if(dpt[a] == dpt[b]) {
            dpt[a]++;
        }
    }
}

void dfs(int nod, int adan)
{
/*    //printf("\n%d----defeu-------------\n", adan);
    for(int i = 1; i <= n; i++) {
            //printf("%d ", viz[i]);
    }
*/
    for(unsigned int i = 0; i < g[nod].size(); i++) {
            if(viz[g[nod][i].catre] == 0) {
                    viz[g[nod][i].catre] = adan + 1;
                    tatici[1][g[nod][i].catre].catre = nod;
                    tatici[1][g[nod][i].catre].cost = g[nod][i].cost;
                    dfs(g[nod][i].catre, adan + 1);
            }
    }
}


bool sortapm(muchie a, muchie b)
{
    return a.val < b.val;
}

int main ()
{

    in = fopen("radiatie.in", "r");
    out = fopen("radiatie.out", "w");

    fscanf(in, "%d%d%d", &n, &m, &k);

    for(int i = 1; i <= n; i++) {
        cap[i] = i;
        tatici[0][i].catre = i;
        tatici[0][i].cost = 0;
        dpt[i] = 1;
    }

    for(int i = 0; i < m; i++) {
        fscanf(in, "%d%d%d", &trare[i].a, &trare[i].b, &trare[i].val);
    }

    sort(trare, trare + m, sortapm);
/*
    for(int i = 0; i <  m; i++) {
        //printf(stdout, "%d %d %d\n", trare[i].a, trare[i].b, trare[i].val);
    }
*/
    for(int i = 0; i < m; i++) {
            if(gase(trare[i].a) != gase(trare[i].b)) {
                    unesc(trare[i].a, trare[i].b);
            } else {
                trare[i].a = 0;
                trare[i].b = 0;
                trare[i].val = 0;
            }
        /*
            for(int j = 1; j <= n; j++) {
                    //printf("%d ", cap[j]);
            } //printf("\n");
            for(int j = 1; j <= n; j++) {
                    //printf("%d ", dpt[j]);
            }//printf("\n-------\n");
        */
    }

    for(int i = 0; i < m; i++) {
            if(trare[i].a != 0) {
                    nozi x;
                    x.catre = trare[i].b;
                    x.cost = trare[i].val;
                    g[trare[i].a].push_back(x);
                    x.catre = trare[i].a;
                    g[trare[i].b].push_back(x);
            }
    }
/*
    //printf("wowow\n");
    for(int i = 0; i < m; i++) {
            //printf(stdout, "%d %d\n", trare[i].a, trare[i].b);
    }
    //printf("wowow\n");
    for(int j = 1; j <= n; j++) {
            for(int i = 0; i < g[j].size(); i++) {
                    //printf("%d ", g[j][i].catre);
            }
            //printf("\n");
            for(int i = 0; i < g[j].size(); i++) {
                    //printf("%d ", g[j][i].cost);
            }
            //printf("\n-----------------\n");
    }
*/
    int x = gase(1);
    //printf("NEBUNU %d \n", x);
    viz[x] = 1;
    dfs(x, 1);

    //printf("\n-------GATABOSS------\n");

    for(int i = 2; i <= LOGBA; i++) {
            for(int j = 1; j <= n; j++) {
                    tatici[i][j].catre = tatici[i - 1][tatici[i - 1][j].catre].catre;
                    tatici[i][j].cost = max(tatici[i - 1][tatici[i - 1][j].catre].cost, tatici[i - 1][j].cost);
            }
    }
/*
    for(int i = 0; i <= LOGBA; i++) {
            for(int j = 1; j <= n; j++) {
                    printf("%d ", tatici[i][j].catre);
            } printf("\n");
    }
*/
    for(int i = 0; i < k; i++) {
        int a, b, deafis = 0;
        fscanf(in, "%d%d", &a, &b);
        if(viz[b] > viz[a]) {
            int aux = a;
            a = b;
            b = aux;
        }
        //printf("--------%d %d\n", a, b);
        while(viz[a] > viz[b]) {
                int j = 0;
                while(viz[tatici[j][a].catre] >= viz[b]) {
                        j++;
                }
                j--;
                deafis = max(deafis, tatici[j][a].cost);
                a = tatici[j][a].catre;
        }
        while(a != b) {
                int j = LOGBA;
                while(tatici[j][a].catre == tatici[j][b].catre) {
                        j--;
                }
                j++;
                deafis = max(deafis, tatici[j][a].cost);
                deafis = max(deafis, tatici[j][b].cost);
                a = tatici[j][a].catre;
                b = tatici[j][b].catre;
        }

        fprintf(out, "%d\n", deafis);
    }

    fclose(in);
    fclose(out);

    return 0;
}