Cod sursa(job #2125957)

Utilizator liviu2000Dragomirescu Liviu liviu2000 Data 8 februarie 2018 21:58:16
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.56 kb
#include <bits/stdc++.h>
#define NMAX 15001

using namespace std;

ifstream fin("radiatie.in") ;
ofstream fout("radiatie.out") ;

vector<pair<pair<int,int>,int> >edge ;
vector<pair<int,int> > graf[NMAX] ;
int parinte[NMAX] , r[NMAX] , index[NMAX] ;
int n , m , k , maxm ;
bool flag ;
bool viz[NMAX] ;

bool compar ( pair<pair<int,int>,int> p1 , pair<pair<int,int>,int> p2 )
{
    return p1.second < p2.second ;
}

void citire()
{
    int i , z , y , x ;
    fin >> n >> m >> k ;
    for ( i = 1 ; i <= m ; i++ )
    {
        fin >> x >> y >> z ;
        edge.push_back(make_pair(make_pair(x,y),z)) ;
    }
    sort(edge.begin(),edge.end(),compar) ;
    memset(r,0,4*n+4) ;
}

int root(int x)
{
    while ( x != parinte[x] )
        x = parinte[x] ;
    return x ;
}

void unite(int x , int y)
{
    if ( r[x] < r[y] )
        parinte[x] = y ;
    else if ( r[x] > r[y] )
        parinte[y] = x ;
    else if ( r[x] == r[y] )
    {
        parinte[y] = x ;
        r[x]++ ;
    }
}

void solve()
{
    int i , r1 ,r2 ;
    for ( i = 1 ; i <= n ; i++ )
        parinte[i] = i ;
    for ( i = 0 ; i < m ; i++ )
    {
        r1 = root(edge[i].first.first) ;
        r2 = root(edge[i].first.second) ;
        if ( r1 != r2 )
        {
            unite(r1,r2) ;
            graf[edge[i].first.first].push_back(make_pair(edge[i].first.second,edge[i].second)) ;
            graf[edge[i].first.second].push_back(make_pair(edge[i].first.first,edge[i].second)) ;
        }
    }
}

void DFS(int nod,int finall)
{
    viz[nod] = true ;
    for (int i = 0 ; i < graf[nod].size() ; i++ )
    {
        if ( graf[nod][i].first == finall )
        {
            parinte[graf[nod][i].first] = nod ;
            index[graf[nod][i].first] = i;
            flag = true ;
        }
        if ( flag == true )
            return ;
        if ( viz[graf[nod][i].first] == false )
        {
            parinte[graf[nod][i].first] = nod ;
            index[graf[nod][i].first] = i ;
            DFS(graf[nod][i].first,finall) ;

        }
    }
}

int main()
{
    int i, x , y, aux ;
    citire() ;
    solve() ;
    for ( i = 1 ; i <= k ; i++ )
    {
        maxm = 0 ;
        fin >> x >> y;
        flag = false ;
        memset(viz,false,n+1) ;
        for ( aux = 1 ; aux <= n ; aux++ )
            parinte[aux] = aux;
        DFS(x,y) ;
        for ( aux = y ; aux != x ; aux = parinte[aux] )
        {
            maxm=max(graf[parinte[aux]][index[aux]].second,maxm) ;
        }
        fout << maxm << '\n' ;
    }
}