Cod sursa(job #2156863)

Utilizator UnseenMarksmanDavid Catalin UnseenMarksman Data 9 martie 2018 06:28:39
Problema Radiatie Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
#define N 15002

using namespace std;

int n,m,q,T[N];

struct muchie{
    int x,y,c;
};

vector<muchie>M;
vector<pair<int,int>>G[N];

bool cmp(const muchie &a, const muchie &b)
{
    return a.c < b.c;
}

int findT(int x)
{
    while(x!=T[x])
        x=T[x];
    return x;
}

void Kruskal()
{
    int sel=0;
    for(int i=0; sel<n-1; i++)
    {
        int a=findT(M[i].x);
        int b=findT(M[i].y);
        if(a!=b)
        {
            T[a]=b;
            sel++;
            G[M[i].x].push_back({M[i].y,M[i].c});
            G[M[i].y].push_back({M[i].x,M[i].c});
        }
    }
}

int Bfs(int x, int y)
{
    int d[N]={0};
    queue<int>Q;
    d[x]=-1;
    Q.push(x);
    while(!d[y])
    {
        int pnod=Q.front();
        Q.pop();
        for(auto w:G[pnod])
        {
            if(!d[w.first])
            {
                d[w.first]=max(d[pnod],w.second);
                Q.push(w.first);
            }
        }
    }
    return d[y];
}

int main()
{
    freopen("radiatie.in", "r", stdin);
    freopen("radiatie.out", "w", stdout);

    muchie a;

    scanf("%d%d%d", &n, &m, &q);
    for(int i=1; i<=m; i++)
    {
        scanf("%d%d%d", &a.x, &a.y, &a.c);
        M.push_back(a);
    }
    for(int i=1; i<=n; i++)
    {
        T[i]=i;
    }
    sort(M.begin(),M.end(),cmp);
    Kruskal();
    while(q)
    {
        int p1,p2,res;
        scanf("%d%d", &p1, &p2);
        res=Bfs(p1,p2);
        printf("%d\n", res);
        q--;
    }
    return 0;
}