Cod sursa(job #1782661)

Utilizator NicusorTelescu Nicolae Nicusor Data 18 octombrie 2016 14:44:26
Problema Radiatie Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <cstdio>
#include <queue>
#include <vector>

using namespace std;

struct XX
{
    int lab,l,kalis;
};

struct XY
{
    int nod1,lung1;
};

struct cmp
{
    bool operator () (XX &a, XX &b)
    {
        return a.l>b.l;
    }
};

bool pass[15001];
vector <int> v;

vector <XY> muchii[15001];

priority_queue < XX , vector <XX> , cmp > TY;

int main()
{
    freopen("radiatie.in","r",stdin);
    freopen("radiatie.out","w",stdout);
    int n,m,k;
    scanf("%d %d %d\n",&n,&m,&k);
    for (int i=1;i<=m;i++)
    {
        int a,b,c;
        scanf("%d %d %d\n",&a,&b,&c);

        muchii[a].push_back({b,c});
        muchii[b].push_back({a,c});
    }
    for (int i=1;i<=k;i++)
    {
        int a,b;
        scanf("%d %d\n",&a,&b);

        int nrx=muchii[a].size();
        for (int j=0;j<nrx;j++)
        {
            int a1=muchii[a][j].nod1;
            int a2=muchii[a][j].lung1;
            TY.push({a1,a2,a2});
        }

        pass[a]=1;
        v.push_back(a);

        while (!TY.empty())
        {
            XX kaop=TY.top();
            TY.pop();

            pass[kaop.lab]=1;
            v.push_back(kaop.lab);

            if (kaop.lab==b)
            {
                printf("%d\n",kaop.kalis);
                break;
            }

            nrx=muchii[kaop.lab].size();

            for (int j=0;j<nrx;j++)
            {
                int nod=muchii[kaop.lab][j].nod1;
                int lung=muchii[kaop.lab][j].lung1;
                if (pass[nod]==0)
                {
                    int kl=kaop.kalis;
                    if (lung>kl) kl=lung;
                    TY.push({nod,lung,kl});
                }
            }
        }
        while (!TY.empty()) TY.pop();
        nrx=v.size();
        for (int j=nrx-1;j>=0;j--)
        {
            pass[v[j]]=0;
            v.pop_back();
        }
    }
}