Cod sursa(job #223259)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 27 noiembrie 2008 21:25:40
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.19 kb
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <set>

using namespace std;

long n, i, j, k, a[30010], b[30010], c[30010], p[30010], m, a1, a2, b1, b2, o, st, l, maxi;
long t[15000], f[15010], g[15010], r[16][15010], q[16][15010], s;

vector <long> v[15010], w[15010];
pair<long, pair<long, long> > per[30010];
long ma(long a, long b)
{
    if(a>b) return a;
    return b;
}

inline long cmp(long x, long y)
{
    return c[x]<c[y];
}

void df(long x, long gr)
{
    long y;
    f[x]=1;
  //  printf("%d\n", x);
    for(y=0; y<v[x].size(); y++)
    {
        if(f[v[x][y]]==0)
        {
            df(v[x][y], gr+1);
            q[0][v[x][y]]=w[x][y];
            r[0][v[x][y]]=x;
        }
    }
    g[x]=gr;
}   
    

int main()
{
    freopen("radiatie.in", "r", stdin);
    freopen("radiatie.out", "w", stdout);
    scanf("%d %d %d\n", &n, &m, &k);
    for(i=1; i<=m; i++)
    {
        scanf("%d %d %d", &a[i], &b[i], &c[i]);
        per[i] = make_pair(c[i], make_pair(a[i], b[i]) );
    }
    for(i=1; i<=n; i++)
    {
        t[i]=i;
    }
    sort(per+1, per+m+1);
    for(i=1; i<=m; i++)
    {
        a[i]=per[i].second.first;
        b[i]=per[i].second.second;
        c[i]=per[i].first;
    }
    for(i=1; i<=m; i++)
    {
        a1=a[i];
        a2=b[i];
        while(a1!=t[a1])
        a1=t[a1];
        while(a2!=t[a2])
        a2=t[a2];
        b1=a1;
        b2=a2;
     //   printf("%d %d\n", b1, b2);
        if(a2!=a1)
        {
            t[a2]=a1;
            v[a[i]].push_back(b[i]);
            w[a[i]].push_back(c[i]);
            v[b[i]].push_back(a[i]);
            w[b[i]].push_back(c[i]);
            b2=a1;
        }
        a1=a[i];
        a2=b[i];
        while(a1!=t[a1])
        {
            o=a1;
            a1=t[a1];
            t[o]=b1;
        }
        while(a2!=t[a2])
        {
            o=a2;
            a2=t[a2];
            t[o]=b2;
        }
   //     for(j=1; j<=n; j++)
    //    printf("%d %d\n", j, t[j]);
   //     printf("\n");
    }
    for(i=1; i<=n; i++)
    {
        if(t[i]==i)
        {
            v[0].push_back(i);
            w[0].push_back(1000000000);
            t[i]=0;
        }
    }     
    df(0, 0); 
    for(i=1; 1<<i<=n; i++)
    {
        for(j=1; j<=n; j++)
        {
            st=r[i-1][j];
            r[i][j]=r[i-1][st];
            q[i][j]=ma(q[i-1][j], q[i-1][st]);    
        }
    }
  /*  for(i=0; 1<<i<=n; i++)
    {
        for(j=0; j<=n; j++)
        printf("%d ", r[i][j]);
        printf("\n");
    }
    for(i=0; 1<<i<=n; i++)
    {
        for(j=0; j<=n; j++)
        printf("%d ", q[i][j]);
        printf("\n");
    }*/
    for(l=1; l<=k; l++)
    {
        scanf("%d %d", &a1, &a2);
        maxi=0;
        if(g[a1]>g[a2])
        {
            s=15;
            while(s>=0)
            {
                st=r[s][a1];
                if(g[st]>=g[a2])
                {
                    maxi=ma(maxi, q[s][a1]);
                    a1=st;
                }
                s--;
            }
        }
        else
        if(g[a2]>g[a1])
        {
            s=15;
            while(s>=0)
            {
                st=r[s][a2];
                if(g[st]>=g[a1])
                {
                    maxi=ma(maxi, q[s][a2]);
                    a2=st;
                }
                s--;
            }
        }
     //   printf("%d\n", maxi);
        if(a1!=a2)
        {
            s=15;
            while(s>=0)
            {
                b1=r[s][a1];
                b2=r[s][a2];
                if(b1!=b2)
                {
                    maxi=ma(maxi, q[s][a1]);
                    maxi=ma(maxi, q[s][a2]);
                    a1=b1;
                    a2=b2;
                }
                s--;
            }
            printf("%d\n", maxi);
            b1=r[0][a1];
            b2=r[0][a2];
            if(b1!=b2)
            {
                maxi=ma(maxi, q[0][a1]);
                maxi=ma(maxi, q[0][a2]);
            }
        }
        printf("%d\n", maxi); 
      //  printf("\n");               
    }        
    return 0;
}