Cod sursa(job #8052)

Utilizator mariusdrgdragus marius mariusdrg Data 23 ianuarie 2007 19:30:11
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.65 kb
#include<stdio.h>
#include<vector>
#include<algorithm>

using namespace std;

const int maxn2 = 40;
const int maxn = 30001;

int mat[maxn2][maxn],mat2[maxn2][maxn];
int i,j,n,m,k,x1,y1,c[maxn],a[maxn],b[maxn],ind[maxn];
int g[maxn],niv[maxn];
vector <int> vect[maxn];
vector <int> vect2[maxn];
int i1,mini;
int k1;

void dfs(int i)
{
        vector <int>:: iterator it;
        vector <int>:: iterator it2;
        for(it2=vect2[i].begin(), it=vect[i].begin();it!=vect[i].end();it++ , it2++)
                if (niv[*it]==0)
                {
                        niv[*it]=niv[i]+1;
                        mat[0][*it]=*it2;
                        mat2[0][*it]=i;
                        dfs(*it);
                }
}

bool cmpf(const int &a,const int &b)
{
        return c[a]<c[b];

}


int grupa(int i)
{
        if (g[i]!=i)
        {
                g[i]=grupa(g[i]);
                return g[i];
        }
        return i;
}
void reuneste(int i,int j)
{
        if (i>j)
        {
                int aux=i;
                i=j;
                j=aux;
        }
        g[grupa(j)]=g[grupa(i)];
}
int max(int i,int j)
{
        if (i>j) return i;
        return j;
}


int main()
{
        freopen("radiatie.in","r",stdin);
        freopen("radiatie.out","w",stdout);
        scanf("%d %d %d",&n,&m,&k1);
        for(i=1;i<=m;i++)
        {
                scanf("%d %d %d",&a[i],&b[i],&c[i]);
                ind[i]=i;
        }
        for(i=1;i<=n;i++)
        {
                g[i]=i;
        }
        sort(ind+1,ind+m+1,cmpf);
        for(i1=1;i1<=m;i1++)
        {
               i=ind[i1];
               if (grupa(a[i])!=grupa(b[i]))
               {
                        reuneste(a[i],b[i]);
                        vect[a[i]].push_back(b[i]);
                        vect2[a[i]].push_back(c[i]);
                        vect[b[i]].push_back(a[i]);
                        vect2[b[i]].push_back(c[i]);
               }
        }
        niv[1]=1;
        dfs(1);
        int x2=1;
        
        for(j=1;(x2<<j)<n;j++)
        {
                for(i=1;i<=n;i++)
                {
                        mat[j][i]=max(mat[j-1][mat2[j-1][i]],mat[j-1][i]);
                        mat2[j][i]=mat2[j-1][mat2[j-1][i]];
                }
        }
        for(i=1;i<=k1;i++)
        {
                scanf("%d %d",&x1,&y1);
                if (niv[x1]<niv[y1])
                {
                        int aux=x1;
                        x1=y1;
                        y1=aux;
                }
                mini=0;
                int l=niv[x1]-niv[y1];
                for(k=j;k>=0;k--)
                {
                        if ((x2<<k)<=l)
                        {
                                if (mini<mat[k][x1])mini=mat[k][x1];
                                x1=mat2[k][x1];
                                l-=(x2<<k);
                        }
                }
                for(k=j;k>=0;k--)
                {
                        if (mat2[k][x1]!=mat2[k][y1])
                        {
                                if (mini<mat[k][x1]) mini=mat[k][x1];
                                if (mini<mat[k][y1]) mini=mat[k][y1];
                                x1=mat2[k][x1];
                                y1=mat2[k][y1];
                        }
                }
                if (x1!=y1)
                {
                        if (mini<mat[0][x1]) mini=mat[0][x1];
                        if (mini<mat[0][y1]) mini=mat[0][y1];
                }
                printf("%d\n",mini);
        }
        
        return 0;
        
}