Cod sursa(job #1265495)

Utilizator roxyroxy2011Luca Roxana roxyroxy2011 Data 17 noiembrie 2014 13:11:15
Problema Radiatie Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.56 kb
#include <fstream>
#include <algorithm>
#define NMAX 15004
#define MMAX 30004

using namespace std;

ifstream cin("radiatie.in");
ofstream cout("radiatie.out");

struct nod{int nr,c;nod*urm;};
typedef nod*Lista;
Lista lis[NMAX];

struct elem{int x,y,c;} v[MMAX];
int n,m,k,comp[NMAX],que[NMAX],urm[NMAX],niv[NMAX],cst[NMAX];

void read();
void solve();
void inserare(Lista&,int,int);
bool compare(elem a,elem b);
void APM();
int minim(int,int);
void bfs();

int main()
{
    read();
    sort(v+1,v+m+1,compare);
    APM();
    bfs();
    solve();
    cin.close();cout.close();
    return 0;
}

void read()
{
    int i;
    cin>>n>>m>>k;
    for (i=1;i<=m;i++)
        cin>>v[i].x>>v[i].y>>v[i].c;
    for (i=1;i<=n;i++)
        {comp[i]=i;lis[i]=NULL;}
}

bool compare(elem a,elem b)
{
    return (a.c<b.c);
}

void APM()
{
    int p=1,i,naux=n,mn,mx;
    while (naux>1)
    {
        if (comp[v[p].x]!=comp[v[p].y])
        {
            if (comp[v[p].x]>comp[v[p].y])
            {
                mn=comp[v[p].y];
                mx=comp[v[p].x];
            }
            else
            {
                mx=comp[v[p].y];
                mn=comp[v[p].x];
            }
            inserare(lis[v[p].x],v[p].y,v[p].c);
            inserare(lis[v[p].y],v[p].x,v[p].c);
            for (i=1;i<=n;i++)
                if (comp[i]==mx) comp[i]=mn;
            naux--;
        }
        p++;
    }
}

void inserare(Lista& prim,int nr,int c)
{
    Lista aux;
    aux=new nod;
    aux->nr=nr;
    aux->c=c;
    aux->urm=prim;
    prim=aux;
}

void bfs()
{
    int p=1,u=1;Lista aux;
    que[p]=1;urm[1]=0;niv[1]=1;
    while (p<=u)
    {
        aux=lis[que[p]];
        while (aux!=NULL)
        {
            while (niv[aux->nr]==0)
            {
                niv[aux->nr]=niv[que[p]]+1;
                urm[aux->nr]=que[p];
                cst[aux->nr]=aux->c;
                que[++u]=aux->nr;
            }
            aux=aux->urm;
        }
        p++;
    }
}

void solve()
{
    int i,x,y;
    for (i=1;i<=k;i++)
    {
        cin>>x>>y;
        cout<<minim(x,y)<<'\n';
    }
}

int minim(int x,int y)
{
    int i=x,j=y,sol=0;
    while (niv[i]>niv[j])
    {
        if(cst[i]>sol) sol=cst[i];
        i=urm[i];
    }
    while (niv[i]<niv[j])
    {
        if(cst[j]>sol) sol=cst[j];
        j=urm[j];
    }

    while (i!=j)
    {
        if(cst[i]>sol) sol=cst[i];
        if(cst[j]>sol) sol=cst[j];
        i=urm[i];
        j=urm[j];
    }
    return sol;
}