Cod sursa(job #17783)

Utilizator diaDiana Adrisor dia Data 16 februarie 2007 21:09:01
Problema Radiatie Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.69 kb
#include <stdio.h>
#include <vector>
#include <algorithm>
#define NMAX 15050
#define INF 666000666

using namespace std;

int N, M, K, X, Y, Rep[NMAX], H[NMAX], Marc[NMAX], T[NMAX], Tc[NMAX], F[NMAX];
vector<pair<int, int> > Muc, Cost;
vector<int> A[NMAX], C[NMAX];

int rep(int x)
{
        int nod = x;
        
        while (Rep[nod] != nod) nod = Rep[nod];
        return nod;
}

void uneste(int x, int y, int cost)
{
        int rx = rep(x), ry = rep(y);

        if (H[ry] > H[rx]) Rep[ry] = rx;
        else
        {
                Rep[ry] = rx;
                H[ry] += (H[rx]==H[ry]);
        }
        A[x].push_back(y); C[x].push_back(cost);
        A[y].push_back(x); C[y].push_back(cost);
}

int max(int a, int b)
{
        return ((a)>(b)?(a):(b));
}

void dfs(int nod)
{
        int i, n = A[nod].size();

        for (i = 0; i < n; i++)
            if (!F[ A[nod][i] ])
            {
                    T[ A[nod][i] ] = nod; Tc[ A[nod][i] ] = C[nod][i];
                    F[ A[nod][i] ] = 1;
                    dfs(A[nod][i]);
            }
}

int main()
{
        int i, j, k, m, cmax;

        freopen("radiatie.in", "r", stdin);
        scanf("%d %d %d", &N, &M, &K);

        for (m = 0; m < M; m++)
        {
            scanf("%d %d %d", &i, &j, &k);
            Muc.push_back(make_pair(i, j));
            Cost.push_back(make_pair(k, m));
        }

        sort(Cost.begin(), Cost.end());

        for (i = 1; i <= N; i++) Rep[i] = i, H[i] = 1;

        for (k = 0; k < M; k++)
        {
                i = Muc[ Cost[k].second ].first; j = Muc[ Cost[k].second ].second;
                if (rep(i) != rep(j))
                   uneste(i, j, Cost[k].first);
        }

        for (i = 1; i <= N; i++)
            if (Rep[i] == i) { F[i] = 1; dfs(i); break; }

        freopen("radiatie.out", "w", stdout);
        while (K--)
        {
                scanf("%d %d", &X, &Y);
                k = X;
                Marc[0] = K;
                while (T[k] != 0) Marc[k] = K, k = T[k];
                Marc[Rep[k]] = K;
                
                m = 1;
                k = Y;
                cmax = -INF;
                do{
                        if (Marc[k] != K) { cmax = max(Tc[k], cmax); k = T[k]; }
                        else m = 0;
                }while (m);
                
                m = k;
                k = X;
                while (k != m && T[k] != 0)
                {
                        if (T[k] != 0) cmax = max(Tc[k], cmax);
                        k = T[k];
                }
                
                printf("%d\n", cmax);
        }

        return 0;
        
}