Cod sursa(job #2103360)

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

vector <int> G[15003],C[15003];

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

struct meh{
int x,y,c;
}u[30003];

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]++;
    }
}


int dfs(int x)
{

    if (x==y) return 1;
    int ok=0;
    int o;
    ap[x]=1;
    for (int i=0; i<G[x].size(); i++){
        o=0;
        if (ap[G[x][i]]==0) o=dfs(G[x][i]);
        if (o) {if (C[x][i]>nr) nr=C[x][i]; ok=1;}
    }
    return ok;
}


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;
}