Cod sursa(job #1090159)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 22 ianuarie 2014 13:29:02
Problema Radiatie Scor 30
Compilator cpp Status done
Runda concurs_2014 Marime 1.88 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
#include <bitset>

#define TEAM pair<int,pair<int,int> >
#define costul first
#define nd1 second.first
#define nd2 second.second

#define INF 0x3f3f3f3f
#define Nmax 15005

using namespace std;
bitset<Nmax> used;
priority_queue<TEAM,vector<TEAM>,greater<TEAM> > Q;
vector<pair<int,int> > G[Nmax];
int N,M,K,daddy[Nmax],X,Y,maxim;

void read()
{
    scanf("%d%d%d",&N,&M,&K);
    int a,b,cost;
    for(int i = 1; i <= M; ++i)
    {
        scanf("%d%d%d",&a,&b,&cost);
        Q.push(make_pair(cost,make_pair(a,b)));
    }
    for(int i  =1; i <= N; ++i)daddy[i] = i;
}

int whos_ur_daddy(int k)
{
    if(daddy[k] != k)
        daddy[k] = whos_ur_daddy(daddy[k]);
    return daddy[k];
}
void couple(int a,int b)
{
    daddy[daddy[a]] = daddy[b];
}

void kruskal()
{
    int a,b,cost;
    while(!Q.empty())
    {
        a = Q.top().nd1;
        b = Q.top().nd2;
        cost = Q.top().costul;
        Q.pop();
        if(whos_ur_daddy(a) != whos_ur_daddy(b))
        {
            couple(a,b);
            G[a].push_back(make_pair(cost,b));
            G[b].push_back(make_pair(cost,a));
        }
    }
}
int gata;

void DFS(int k,int maxi)
{
    if(k == Y)
    {
        gata = 1;
        maxim = maxi;
    }
    if(gata)
        return;
    used[k] = 1;
    for(vector<pair<int,int> >::iterator it = G[k].begin(); it != G[k].end(); ++it)
        if(!used[it->second])
            DFS(it->second,max(maxi,it->first));
}

void answer()
{

    for(int i = 1; i <= K; ++i)
    {
        used = 0;
        gata = 0;
        scanf("%d%d",&X,&Y);
        DFS(X,-INF);
        printf("%d\n",maxim);
    }
}

int main()
{
    freopen("radiatie.in","r",stdin);
    freopen("radiatie.out","w",stdout);

    read();
    kruskal();
    answer();

    return 0;
}