Cod sursa(job #3194036)

Utilizator Bianca2507Negret Bianca Bianca2507 Data 16 ianuarie 2024 18:54:08
Problema Radiatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <bitset>
using namespace std;
ifstream cin("apm2.in");
ofstream cout("apm2.out");
int n,m,q,t[10005],sol,d[10005],rad,a,b;
pair<int,pair<int,int>>v[100005];///cost ,x,y
vector<pair<int,int>>apm[10005];
bool viz[10005];
bitset<10005>fr;
int radacina(int x)
{
    while(t[x]>0)
        x=t[x];
    return x;
}
void dfs(int nod)
{
    viz[nod]=1;
    for(int i=0;i<apm[nod].size();i++)
    {
        int vecin=apm[nod][i].first;
        int c=apm[nod][i].second;
        if(viz[vecin]==0)
        {
            t[vecin]=nod;
            d[vecin]=c;
            dfs(vecin);
        }
    }
}
void radacina1(int x)
{
    while(t[x]>0&&fr[x]==0)
    {
        fr[x]=1;
        x=t[x];
    }
    if(fr[x]==1)
        fr[x]=0;
    else
        fr[x]=1;
}
void radacina2(int x)
{
    while(t[x]>0&&fr[x]!=0)
    {
        sol=max(sol,d[x]);
        x=t[x];
    }
}
int main()
{
    cin>>n>>m>>q;
    for(int i=1;i<=m;i++)
    {
        cin>>v[i].second.first>>v[i].second.second>>v[i].first;
    }
    for(int i=1;i<=n;i++)
        t[i]=-1;
    sort(v+1,v+m+1);
    for(int i=1;i<=m;i++)
    {
        int rx=radacina(v[i].second.first);
        int ry=radacina(v[i].second.second);
        if(rx!=ry)
        {
            if(t[rx]<t[ry])
            {
                t[rx]+=t[ry];
                t[ry]=rx;
            }
            else
            {
                t[ry]+=t[rx];
                t[rx]=ry;
            }
            apm[v[i].second.first].push_back({v[i].second.second,v[i].first});
            apm[v[i].second.second].push_back({v[i].second.first,v[i].first});
        }
    }
    for(int i=1;i<=n;i++)
        if(t[i]<0)
    {
        rad=i;break;
    }
     t[rad]=0;
    dfs(rad);

    while(q--)
    {
        cin>>a>>b;
        sol=0;
        fr.reset();
        radacina1(a);
        radacina1(b);
        radacina2(a);
        radacina2(b);
        cout<<sol-1<<'\n';
    }
    return 0;
}