Cod sursa(job #409778)

Utilizator dead_knightTitei Paul Adrian dead_knight Data 3 martie 2010 21:09:29
Problema Radiatie Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.71 kb
#include<cstdio>
#include<fstream>
#include<vector>
#include<algorithm>
#include<iostream>
#define MAX 15005
using namespace std;
struct muchie{
    int i,j,c;
    friend bool operator <(const muchie &a, const muchie &b)
    {
        return a.c<b.c;
    }
};
struct nod{
    int i,c;
    nod *next;
};

muchie v[30005];
nod *G[MAX];
int t[MAX],h[MAX],na,n,m,a[MAX],radacini[MAX],nrad,vrad[MAX],viz[MAX];


int radacina(int x)
{
    int y=x,tmp;
    while(t[x])
        x=t[x];
    while(t[y])
        tmp=t[y],t[y]=x,y=tmp;
    return x;
}

void addmuchie(int x,int y,int c)
{
    nod *p=new nod;
    p->c=c;
    p->i=y;
    p->next=G[x];
    G[x]=p;
    p=new nod;
    p->c=c;
    p->i=x;
    p->next=G[y];
    G[y]=p;
}

void afisgraf()
{
    nod *p;
    int i;
    for(i=1;i<=n;i++)
    {
        printf("%d: ",i);
        for(p=G[i];p;p=p->next)
            printf("(%d,%d) ",p->i,p->c);
        printf("\n");
    }
}

void dfs(int varf,int final)
{
    viz[varf]=1;
    for(nod *p=G[varf] ; p ; p=p->next)
    {
        int vecin=p->i;
        if(viz[vecin]==0)
        {
            viz[vecin]=1;
            t[vecin]=varf;
            if(vecin==final)
                return;
            dfs(vecin,final);
        }
    }
}

int costu(int x,int y)
{
    nod *p;
    for(p=G[x]; p->i!=y ;p=p->next);
    return p->c;
}

int main()
{
    int k,i,max;
    freopen("radiatie.in","r",stdin);
    freopen("radiatie.out","w",stdout);
    scanf("%d %d %d", &n, &m, &k);
    for(i=1;i<=m;i++)
    {
        int x,y,c;
        scanf("%d %d %d", &x, &y, &c);
        v[i].i=x;
        v[i].j=y;
        v[i].c=c;
    }
    sort(v+1,v+m+1);
    for(i=1;i<=m;i++)//apm
    {
        int ri=radacina(v[i].i),rj=radacina(v[i].j);
        if(ri!=rj)
        {
            a[++na]=i;
            if(h[ri]<h[rj])
                t[ri]=rj;
            else if(h[rj]<h[ri])
                t[rj]=ri;
            else
                t[ri]=rj,h[rj]++;
        }
    }
    for(i=1;i<=n;i++)//vad cati arbori exista dupa apm si tin minte rad lor;
        if(vrad[t[i]]==0 && t[i]!=0)
            radacini[++nrad]=t[i],vrad[t[i]]=1;
    for(i=1;i<=na;i++)
        addmuchie(v[a[i]].i,v[a[i]].j,v[a[i]].c);
    for(i=1;i<=k;i++)
    {
        int x,y;
        max=0;
        scanf("%d %d", &x, &y);
        for(int qq=1;qq<=n;qq++)
            t[qq]=0,viz[qq]=0;
        viz[x]=1;
        dfs(x,y);
        while(t[y]!=0)
        {
            int costul=costu(y,t[y]);
            //printf("%d %d\n", y, t[y]);
            if(costul>max)
                max=costul;
            y=t[y];
        }
        printf("%d\n",max);
    }
    return 0;
}