Cod sursa(job #2374137)

Utilizator CodCatalinCodreanu Catalin CodCatalin Data 7 martie 2019 17:07:48
Problema Radiatie Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <bits/stdc++.h>
using namespace std;

ifstream f("radiatie.in");
ofstream g("radiatie.out");

vector <int>v[15003],d[15003];
struct muchie
{
    int a,b,c;
}m[30003];
bool cmp(muchie x12,muchie y12)
{
    return x12.c<y12.c;
}
int n,mu,k,ind=1,mf,t[15003],ad[15003],ok,sf,in;
bool ap[15003];
int Root(int p)
{
    int q=p;
    while(q!=t[q])q=t[q];
    while(p!=t[p])
    {
        int aux=t[p];
        t[p]=q;
        p=aux;
    }
    return q;
}
void Unite(int p,int q)
{
    if(ad[p]>ad[q])
    {
        t[q]=p;
    }
    else t[p]=q;
    if(ad[p]==ad[q])ad[q]++;
}
void DFS(int nod,int Max)
{
    if(ok)
    {
        ap[nod]=1;
        if(nod==sf)
        {
            g<<Max<<'\n';
            ok=0;
        }
        else
        {
            int nr=v[nod].size();
            for(int i=0;i<nr;++i)
            {
                if(!ap[v[nod][i]])
                {
                    ap[v[nod][i]]=1;
                    DFS(v[nod][i],max(Max,d[nod][i]));
                    ap[v[nod][i]]=0;
                }
            }
        }
        ap[nod]=0;
    }
}
int main()
{
    f>>n>>mu>>k;
    for(int i=1;i<=mu;++i)f>>m[i].a>>m[i].b>>m[i].c;
    for(int i=1;i<=n;++i)t[i]=i;
    sort(m+1,m+mu+1,cmp);
    while(mf<n-1)
    {
        int x=Root(m[ind].a);
        int y=Root(m[ind].b);
        if(x!=y)
        {
            v[x].push_back(y);
            v[y].push_back(x);
            d[x].push_back(m[ind].c);
            d[y].push_back(m[ind].c);
            mf++;
            Unite(x,y);
        }
        ind++;
    }
    for(int i=1;i<=k;++i)
    {
        f>>in>>sf;ok=1;
        DFS(in,0);
    }
}