Cod sursa(job #180328)

Utilizator cretuMusina Rares cretu Data 16 aprilie 2008 21:30:41
Problema Radiatie Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.52 kb
#include <fstream>
#include <vector>
#define MAXN 15001
#define MAXM 30001
#define INF -1
#define maxi(a, b) ((a) > (b) ? (a) : (b))

using namespace std;

int n, m, cnt = 0;
int p[MAXN], h[MAXN];
bool s[MAXN];
int a[2*MAXM][15], e[2*MAXM], l[2*MAXM], lg[2*MAXM];

struct tata{
    int x, c;
}t[MAXN], aux;

vector<vector<tata> > v;

struct muchie{
    int v1, v2, c;
} g[MAXM];

struct Cmp{
    bool operator () (muchie a, muchie b)
    {
         return (a.c < b.c);       
    }
};

int Find(int x)
{
    if (x != p[x]) p[x] = Find(p[x]);
    return p[x];    
}

void Union(int x, int y)
{
    if (h[x] > h[y]) p[y] = p[x];
    else 
    {
        p[x] = p[y];
        if (h[x] == h[y]) h[y]++;     
    }     
}

void DF(int nod, int lvl)
{
    s[nod] = 1;
    l[nod] = lvl;
    
    int x = v[nod].size(), i;
    for (i = 0; i < x; i++)      
        if (!s[v[nod][i].x])
        {
            t[v[nod][i].x].x = nod;
            t[v[nod][i].x].c = v[nod][i].c;
            
            DF(v[nod][i].x, lvl+1);               
        }
}

int GetCMax(int x, int y)
{
    int rez = 0;
    while (x != y)
    {
         if (l[x] > l[y])      
         {  
             rez = maxi(rez, t[x].c);
             x = t[x].x;  
         }
         else 
         {
             rez = maxi(rez, t[y].c);  
             y = t[y].x;
         }
    }  
    return rez;  
}

int main()
{
    int i, j, x, x1, x2, cost, T;
    
    ifstream fin("radiatie.in");
    fin >> n >> m >> T;
    
    v.resize(n+1);
    
    for (i = 1; i <= m; i++)    
    {
        fin >> x1 >> x2 >> cost;
        g[i].v1 = x1;
        g[i].v2 = x2;
        g[i].c = cost;
    }
    
    sort(g+1, g+m+1, Cmp());    
    
    for (i = 1; i <= n; i++){ p[i] = i; h[i] = 0; }
    
    int cnt = 0;
    for (i = 1; i <= m; i++)
    {
        x1 = Find(g[i].v1);
        x2 = Find(g[i].v2);
        if (x1 != x2)    
        {
           aux.x = g[i].v2;
           aux.c = g[i].c;   
           v[g[i].v1].push_back(aux);
           aux.x = g[i].v1;
           v[g[i].v2].push_back(aux);
           cnt++;
           if (cnt > n) break;
           Union(x1, x2);  
        }
    }
    
    DF(1, 1);
    
    ofstream fout("radiatie.out");
    
    int lca, max1;

    for (; T; T--)
    {
        fin >> x1 >> x2;       
        max1 = GetCMax(x1, x2);          
        fout << max1 << "\n";         
    }
     
    fin.close();
    fout.close();
    
    return 0;
}