Cod sursa(job #2684455)

Utilizator DavidAA007Apostol David DavidAA007 Data 13 decembrie 2020 19:03:33
Problema Radiatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.72 kb
#include<fstream>
#include<algorithm>
#include<iostream>
#include<vector>
using namespace std;
ifstream f("radiatie.in");
ofstream g("radiatie.out");
int n,m,k,cost,i,a,b;
vector<int> dis[15001];
int tt[15001], ttv[15001], sz[15001], pz1[15001], pz2[15001];
int ans[15002];
struct mch
{
    int a;
    int b;
    int c;
};
mch 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 Uniune(int a, int b)
{
    if(sz[a]>=sz[b])
    {
        tt[b]=a;
        sz[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(i=1;i<=m;i++)
        f>>v[i].a>>v[i].b>>v[i].c;
    sort(v+1,v+m+1,cmp);
    for(i=1;i<=k;i++)
    {
        f>>a>>b;
        pz1[i]=a;
        pz2[i]=b;
        dis[a].push_back(i);
        dis[b].push_back(i);
    }
    for(i=1;i<=n;i++)
    {
        tt[i]=i;
        ttv[i]=i;
        sz[i]=1;
    }
    for(i=1;i<=m;i++)
    {
        cost=v[i].c;
        if(Find1(v[i].a)!=Find1(v[i].b))
            Uniune(Find1(v[i].a),Find1(v[i].b));
    }
    for(i=1;i<=k;i++)
        g<<ans[i]<<"\n";
    return 0;
}