Cod sursa(job #1235741)

Utilizator alex_HarryBabalau Alexandru alex_Harry Data 30 septembrie 2014 14:56:48
Problema Radiatie Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.44 kb
#include <fstream>
#include <vector>
#include <algorithm>
#define NMAX 15005
#define MMAX 30005
using namespace std;
ifstream f("radiatie.in");
ofstream g("radiatie.out");
struct Element{
int x;
int y;
int c;
};
Element Array[MMAX];
int N,M,Solution[MMAX],K;
int R[NMAX],TT[NMAX],Result,Number,F[NMAX];
bool V[MMAX];
bool Use[NMAX];
int Level[NMAX];
vector <int> G[NMAX];
vector <int> Cost[NMAX];
int C[NMAX];
bool compare(Element a,Element b)
{
    return a.c<b.c;
}
void Read()
{
    f>>N>>M>>K;
    int i;
    for(i=1;i<=M;i++)
        f>>Array[i].x>>Array[i].y>>Array[i].c;
    sort(Array+1,Array+M+1,compare);
}
int Father(int x)
{
    while(TT[x]!=x)
        x=TT[x];
    while(TT[x]!=x)
        {
        int y=TT[x];
        TT[x]=x;
        x=y;
        }
    return x;
}
void DFS(int node)
{
    Use[node]=1;
    for(int i=0;i<G[node].size();i++)
    {
        int neighbour=G[node][i],cost=Cost[node][i];
        if(Use[neighbour]==0)
        {
            Level[neighbour]=Level[node]+1;
            C[neighbour]=cost;
            F[neighbour]=node;
            DFS(neighbour);
        }
    }
}
void Unite(int x,int y)
{
    if(R[x]<R[y])
        TT[x]=y;
    else
        TT[y]=x;
    if(R[x]==R[y])
        R[x]++;
}
int findRoot()
{
    int i;
    for(i=1;i<=N;i++)
        if(TT[i]==i)
            return i;
}
void buildG()
{
    for(int i=1;i<=Number;i++)
    {
        int a,b;
        a=Array[Solution[i]].x;
        b=Array[Solution[i]].y;
        int cost=Array[Solution[i]].c;
        G[a].push_back(b);
        G[b].push_back(a);
        Cost[a].push_back(cost);
        Cost[b].push_back(cost);
    }
}


void solveAPM()
{
    int i;
    for(i=1;i<=N;i++)
        TT[i]=i;
    for(i=1;i<=M;i++)
    {
        if(Father(Array[i].x)!=Father(Array[i].y))
            Unite(Father(Array[i].x),Father(Array[i].y)),Result+=Array[i].c,Number++,Solution[Number]=i;
    }
}

void Solve(int x,int y)
{
    if(Level[y]>Level[x])
        swap(x,y);
    int Max=0;
    while(Level[x]>Level[y])
    {
        Max=max(Max,C[x]);
        x=F[x];
    }
    while(x!=y)
    {
        Max=max(Max,C[x]);
        x=F[x];
        Max=max(Max,C[y]);
        y=F[y];
    }
    g<<Max<<"\n";
}
int main()
{
    Read();
    solveAPM();
    buildG();
    DFS(1);
    while(K--)
    {
        int a,b;
        f>>a>>b;
        Solve(a,b);
    }
    return 0;
}