Cod sursa(job #2103353)

Utilizator aeromaniaXRadoi Iulian aeromaniaX Data 10 ianuarie 2018 01:04:38
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <bits/stdc++.h>
using namespace std;

vector <int> G[1001],C[10001];

int T[10001],p[10001],x,y,m,k,nr,ok,ap[10001],n,ceva,ct;

struct meh{
int x,y,c;
}u[200005],sol[20000005];

bool cmp(meh x,meh y)
{
    return x.c<y.c;
}

int root (int x)
{
    while(T[x]!=x)
        x=T[x];

    return x;
}

void unif(int x,int y)
{
    if(p[x]<p[y])
            T[x]=y;
    if(p[x]>p[y])
         T[y]=x;
    if(p[x]==p[y])
    {
        T[y]=x;
        p[x]++;
    }
}


void dfs(int x)
{

    if(x==y)
        ok=1;
    else if(ok==0){

        ap[x]=1;
        int sz=G[x].size();
        for(int i=0;i<sz;i++)
            if(!ap[G[x][i]]){

                dfs(G[x][i]);
               if(nr<C[x][i]) nr=C[x][i];
               if(ok) return;
            }

}

}


int main()
{
    freopen("radiatie.in","r",stdin);
    freopen("radiatie.out","w",stdout);
    scanf("%d%d%d",&n,&m,&ceva);

    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&u[i].x,&u[i].y,&u[i].c);
        T[i]=i;
    }


    sort(u+1,u+m+1,cmp);

    int i=1;
    while(k<n-1)
    {
        int rx=root(u[i].x);
        int ry=root(u[i].y);

        if(rx!=ry)
        {
            k++;
            ct+=u[i].c;
            G[u[i].x].push_back(u[i].y);
            C[u[i].x].push_back(u[i].c);
            G[u[i].y].push_back(u[i].x);
            C[u[i].y].push_back(u[i].c);
            unif(rx,ry);
        }
        i++;
    }

    while(ceva--)
    {
        memset(ap,0,sizeof(ap));
        scanf("%d%d",&x,&y);
        nr=0,ok=0;
        dfs(x);
        printf("%d\n",nr);
    }

    return 0;
}