Cod sursa(job #1265490)

Utilizator malina_floreaMalina Florea malina_florea Data 17 noiembrie 2014 13:09:42
Problema Radiatie Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.72 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#define DMAX 1005
using namespace std;
FILE * fin = fopen ("radiatie.in", "r");
FILE * fout = fopen ("radiatie.out", "w");

struct muchie {int x, y, cost;};
struct vecin {int varf, cost;};

void read();
void kruskal();
bool cmp(muchie a, muchie b)
{return a.cost<b.cost;};
void creazaGprim();
void DFS(int, int, int, int);
int query(int, int);
void rez();

int n, m, k;
int conex[DMAX];

muchie muchii[DMAX];
int solutie[DMAX], lgsol;

vector <vecin> Gprim[DMAX];

int level[DMAX], father[DMAX], costuri[DMAX];

int main()
{
    read();
    kruskal();
    creazaGprim();
    DFS(1, 0, 1, 0);
    rez();
    
    fclose(fin);
    fclose(fout);
    return 0;
}

void rez()
{
    int i, a, b;
    
    for (i=1; i<=k; i++)
    {
        fscanf (fin, "%d %d", &a, &b);
        fprintf (fout, "%d\n", query(a, b));
    }
}

int query(int x, int y)
{
    int rezultat = 0;
    
    if (level[y]<level[x])
        swap(x, y);
    
    while (level[y] != level[x])
    {
        rezultat = max(rezultat, costuri[y]);
        y = father[y];
    }
    
    while (x!=y)
    {
        rezultat = max(rezultat, max(costuri[x], costuri[y]));
        x = father[x];
        y = father[y];
    }
    
    return rezultat;
}

void DFS(int nod, int parinte, int nivel, int cost)
{
    int i;
    father[nod] = parinte;
    level[nod] = nivel;
    costuri[nod] = cost;
    for (i=0; i<Gprim[nod].size(); i++)
        if (level[Gprim[nod][i].varf] == 0)
            DFS (Gprim[nod][i].varf, nod, nivel+1, Gprim[nod][i].cost);
}

void creazaGprim()
{
    int i;
    int parinte, fiu, cost;
    vecin vecin;
    
    for (i=1; i<=n-1; i++)
    {
        parinte = muchii[solutie[i]].x;
        fiu = muchii[solutie[i]].y;
        cost = muchii[solutie[i]].cost;
        
        vecin.varf = fiu;
        vecin.cost = cost;
        Gprim[parinte].push_back(vecin);
        
        vecin.varf = parinte;
        vecin.cost = cost;
        Gprim[fiu].push_back(vecin);
    }
}

void kruskal()
{
    int i, j, minim, maxim;
    
    sort (muchii+1, muchii+1+m, cmp);
    for (i=1; i<=n; i++) conex[i]=i;
    for (i=1; i<=m; i++)
        if (conex[muchii[i].x]!=conex[muchii[i].y])
        {
            minim = conex[muchii[i].x];
            maxim = conex[muchii[i].y];
            if (maxim<minim)
            {
                minim = conex[muchii[i].y];
                maxim = conex[muchii[i].x];
            }
            solutie[++lgsol]=i;
            for (j=1; j<=n; j++)
                if (conex[j]==maxim)
                    conex[j]=minim;
        }
}

void read()
{
    int i;
    
    fscanf (fin, "%d %d %d", &n, &m, &k);
    for (i=1; i<=m; i++)
    {
        fscanf (fin, "%d %d %d", &muchii[i].x, &muchii[i].y, &muchii[i].cost);
    }
}