Cod sursa(job #3277212)

Utilizator apoputoaievladVlad Cristian Apoputoaie apoputoaievlad Data 15 februarie 2025 13:53:04
Problema Radiatie Scor 0
Compilator cpp-64 Status done
Runda vs11_12_vine_oji_2025 Marime 2.09 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("radiatie.in");
ofstream fout("radiatie.out");

struct muchie
{
    int x,y,cost;
    bool operator < (muchie m) const
    {
        return cost<m.cost;
    }
};

int n,m,k,t[15002];
muchie a[30003];
vector < pair<int,int> > liste[15002];
int dist[15002][15002];

void Union(int x, int y)
{
    t[y]=x;
}

int Find(int x)
{
    int y,rad=x;
    while(t[rad]!=0)
        rad=t[rad];
    while(x!=rad)
    {
        y=t[x];
        t[x]=rad;
        x=y;
    }
    return rad;
}

void Kruskal()
{
    int i,nrc,x,y,j;
    sort(a+1,a+m+1);
    nrc=n;
    for(i=1;i<=m&&nrc>1;i++)
    {
        x=Find(a[i].x);
        y=Find(a[i].y);
        if(x!=y)
        {
            //cout<<a[i].x<<" "<<a[i].y<<"\n";
            Union(x,y);
            nrc--;
            liste[a[i].x].push_back({a[i].y,a[i].cost});
            liste[a[i].y].push_back({a[i].x,a[i].cost});

        }
    }
}

void Bfs(int nod)
{
    bitset <15002> viz;
    int d,x;
    queue < pair <int,int> > q;
    q.push({nod,0});
    viz[nod]=1;
    while(!q.empty())
    {
        x=q.front().first;
        d=q.front().second;
        q.pop();
        for(auto e:liste[x])
            if(dist[e.first][nod]==0&&viz[e.first]==0)
            {
                viz[e.first]=1;
                dist[e.first][nod]=dist[nod][e.first]=max(d,e.second);
                q.push({e.first,max(d,e.second)});
            }
    }
    /**cout<<endl;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
            cout<<dist[i][j]<<" ";
        cout<<endl;
    }*/
}

int main()
{
    int i,f,e;
    fin>>n>>m>>k;
    for(i=1;i<=m;i++)
        {
            fin>>a[i].x>>a[i].y>>a[i].cost;
        }
    Kruskal();
    /**for(i=1;i<=n;i++)
    {
        for(auto j:liste[i])
            cout<<j.first<<" ";
        cout<<endl;
    }*/
    for(i=1;i<=k;i++)
        {
            fin>>e>>f;
            if(dist[e][f]==0)
                Bfs(e);
            fout<<dist[e][f]<<"\n";
        }
    return 0;
}