Cod sursa(job #2645023)

Utilizator vladadAndries Vlad Andrei vladad Data 26 august 2020 19:42:42
Problema Radiatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.77 kb
#include<bits/stdc++.h>
using namespace std;
ifstream f("radiatie.in");
ofstream g("radiatie.out");
int n, m, k, cost;
vector<int>dis[15001];
int tt[15001], ttv[15001], sz[15001], pz1[15001], pz2[15001];
int ans[15002];
struct mch
{
    int a, b, c;
} v[30002];
bool cmp(mch a, mch b)
{
    return a.c<b.c;
}
int Find1(int nod)
{
    if(tt[nod]==nod)
        return nod;
    return tt[nod]=Find1(tt[nod]);
}
int Find2(int nod)
{
    if(ttv[nod]==nod)
        return nod;
    return ttv[nod]=Find2(ttv[nod]);
}
void Union(int a, int b)
{
    if(sz[a]>=sz[b])
    {
        tt[b]=a;
        sz[a]+=sz[b];
    }
    else
    {
        tt[a]=b;
        sz[b]+=sz[a];
    }
    int x=Find2(ttv[a]);
    int y=Find2(ttv[b]);
    if(dis[x].size()<dis[y].size())
        swap(x, y);
    for(int i=0; i<dis[y].size(); i++)
    {
        int val=dis[y][i];
        if(Find2(pz1[val])==x && Find2(pz2[val])==y)
            ans[val]=cost;
        else
        {
            if(Find2(pz1[val])==y && Find2(pz2[val])==x)
                ans[val]=cost;
            else
                dis[x].push_back(val);
        }
    }
    ttv[y]=x;
}
int main()
{
    f>>n>>m>>k;
    for(int i=1; i<=m; i++)
        f>>v[i].a>>v[i].b>>v[i].c;
    sort(v+1, v+m+1, cmp);
    for(int i=1; i<=k; i++)
    {
        int a, b;
        f>>a>>b;
        pz1[i]=a;
        pz2[i]=b;
        dis[a].push_back(i);
        dis[b].push_back(i);
    }
    for(int i=1; i<=n; i++)
    {
        tt[i]=i;
        ttv[i]=i;
        sz[i]=1;
    }
    for(int i=1; i<=m; i++)
    {
        cost=v[i].c;
        if(Find1(v[i].a)!=Find1(v[i].b))
            Union(Find1(v[i].a), Find1(v[i].b));
    }
    for(int i=1; i<=k; i++)
        g<<ans[i]<<'\n';
    return 0;
}