Cod sursa(job #3193676)

Utilizator Theo20067Cismaru Theodor-Alexe Theo20067 Data 15 ianuarie 2024 12:40:14
Problema Radiatie Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <bitset>
using namespace std;
ifstream fin ("radiatie.in");
ofstream fout("radiatie.out");
int n,m,Q,i,j,nr,T[10003],D[10003],r,x,y,maxim;
bitset<10003> viz;
struct elem
{
    int x,y,cost;
}V[100003];
vector < pair<int,int> > A[100003];
bool cmp(elem a,elem b){ return a.cost<b.cost;}
int get_root(int x)
{
    while(T[x]>0)
        x=T[x];
    return x;
}
void join(int x,int y)
{
    int root_a=get_root(x);
    int root_b=get_root(y);
    if(root_a==root_b)
        return;
    if(T[root_a]>T[root_b])
        swap(root_a,root_b);
    T[root_a]+=T[root_b];
    T[root_b]=root_a;
}
bool query(int x, int y){ return get_root(x)!=get_root(y);}
void dfs(int x)
{
    viz[x]=1;
    for(int j=0;j<A[x].size();j++)
    {
        int vecin=A[x][j].first;
        int cost=A[x][j].second;
        if(!viz[vecin])
        {
            D[vecin]=cost;
            T[vecin]=x;
            dfs(vecin);
        }
    }
}
void lca1(int x)
{
    if(!viz[x])
        viz[x]=1;
    else
    {
        viz[x]=0;
        return;
    }
    if(T[x])
        lca1(T[x]);
}
void lca2(int x)
{
    if(!viz[x])
        return;
    maxim=max(maxim,D[x]);
    if(T[x])
        lca2(T[x]);
}
int main()
{
    fin>>n>>m>>Q;
    for(i=1;i<=m;i++)
        fin>>V[i].x>>V[i].y>>V[i].cost;
    for(i=1;i<=n;i++)
        T[i]=-1;
    sort(V+1,V+m+1,cmp);
    for(i=1;i<=m;i++)
    {
        if(query(V[i].x,V[i].y))
        {
            join(V[i].x,V[i].y);
            nr++;
            A[V[i].x].push_back({V[i].y,V[i].cost});
            A[V[i].y].push_back({V[i].x,V[i].cost});
            if(nr==n-1)
                break;
        }
    }
    for(i=1;i<=n;i++)
        if(T[i]<0)
        {
            r=i;
            break;
        }
    dfs(r);
    T[r]=0;
    D[r]=0;
    for(i=1;i<=Q;i++)
    {
        fin>>x>>y;
        viz.reset();
        maxim=0;
        lca1(x);
        lca1(y);
        lca2(x);
        lca2(y);
        fout<<maxim<<"\n";
    }
    return 0;
}