Cod sursa(job #1265504)

Utilizator stefan1Medvichi Stefan stefan1 Data 17 noiembrie 2014 13:15:21
Problema Radiatie Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.69 kb
#include <fstream>
#include <cstdio>
#include <vector>
#include <algorithm>
#define NMAX 30002
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;
    int cost;
};
vector <vecin> Gprim[NMAX];

int n, m, k, lgsol;
Muchie muchii[NMAX];
int solutie[NMAX], cnx[NMAX], level[NMAX], father[NMAX], costuri[NMAX];

void citire();
void kruskal();
bool cmp(Muchie a, Muchie b);
void createaGprim();
void DFS(int nod, int parinte, int nivel, int cost);
int query(int x, int y);

int main()
{
int i, x, y;
citire();
kruskal();
createaGprim();
DFS(1, 0, 1, 0);
for (i=1; i<=k; i++)
{
    fscanf(fin, "%d %d\n", &x, &y);
    fprintf(fout, "%d\n", query(x, y));
}
return 0;
}

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

bool cmp(struct Muchie a, struct Muchie b)
{
return a.cost<b.cost;
}

void createaGprim()
{
int i;
int nodParinte, nodFiu, cost;
vecin vecin;

for (i=1; i<=lgsol; i++)
{
    nodParinte=muchii[solutie[i]].x;
    nodFiu=muchii[solutie[i]].y;
    cost=muchii[solutie[i]].cost;

    vecin.varf=nodFiu;
    vecin.cost=cost;
    Gprim[nodParinte].push_back(vecin);

    vecin.varf=nodParinte;
    vecin.cost=cost;
    Gprim[nodFiu].push_back(vecin);
}

}

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 citire()
{
int i;
fscanf(fin, "%d %d %d\n", &n, &m, &k);
for (i=1; i<=m; i++)
    {
        fscanf(fin, "%d %d %d\n", &muchii[i].x, &muchii[i].y, &muchii[i].cost);
    }
}

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;
}