Cod sursa(job #1319635)

Utilizator roxyroxy2011Luca Roxana roxyroxy2011 Data 17 ianuarie 2015 11:39:37
Problema Radiatie Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.62 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],H[NMAX],P[NMAX][6],que[NMAX],cst[NMAX],niv[NMAX],urm[NMAX];

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

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

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

int find_nod(int x)
{
    while (comp[x]>0)
        x=comp[x];
    return x;
}

void union_nod(int x,int y)
{
    if (H[x]<H[y])
        comp[x]=y;
    else if (H[x]>H[y])
        comp[y]=x;
    else
    {
        comp[x]=y;
        H[y]++;
    }
}

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++)
        {lis[i]=NULL;H[i]=1;}
}

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

void APM()
{
    int p=1,i,naux=n,a,b;
    while (naux>1)
    {
        a=find_nod(v[p].x);
        b=find_nod(v[p].y);
        if (a!=b)
        {
            union_nod(a,b);
            inserare(lis[v[p].x],v[p].y,v[p].c);
            inserare(lis[v[p].y],v[p].x,v[p].c);
            naux--;
        }
        p++;
    }
}

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