Submission #915337

#TimeUsernameProblemLanguageResultExecution timeMemory
915337StefanL2005Crocodile's Underground City (IOI11_crocodile)C++14
100 / 100
840 ms92528 KiB
#include <bits/stdc++.h>
using namespace std;
#define inf 1000*1000*1000 + 6

struct nod{
    int nr;
    vector<nod*> Ch;
    vector<int> Cost;
};

struct muchie{
    int start, end, cost;
};

bool rule (muchie A, muchie B)
{
    if (A.cost == B.cost)
    {
        if (A.start == B.start)
            return A.end > B.end;
        return A.start > B.start;
    }
    return A.cost > B.cost;
}

void bloom (nod *node, vector<pair<int,int>> &Choice, vector<int> &Check, priority_queue<muchie, vector<muchie>, decltype(&rule)> &Q)
{
    for (int i = 0; i < node->Ch.size(); i++)
    {
        auto vecin = node->Ch[i];

        if (Check[vecin->nr] >= 2)
            continue;

        muchie A; A.start = node->nr; A.end = vecin->nr; A.cost = node->Cost[i] + Choice[node->nr].second;
        Q.push(A);
    }
}

int travel_plan(int n, int m, int R[][2], int L[], int k, int exit[])
{
    vector<int> Check(n, 0);
    vector<nod*> Tree(n);
    vector<pair<int,int>> Choice(n);
    priority_queue<muchie, vector<muchie>, decltype(&rule)> Q(rule);
    
    for (int i = 0; i < n; i++)
    { Tree[i] = new nod; Tree[i]->nr = i; }

    for (int i = 0; i < m; i++)
    {
        int a = R[i][0], b = R[i][1];

        Tree[a]->Ch.push_back(Tree[b]);
        Tree[a]->Cost.push_back(L[i]);
        Tree[b]->Ch.push_back(Tree[a]);
        Tree[b]->Cost.push_back(L[i]);
    }

    for (int i = 0; i < k; i++)
    {
        Choice[exit[i]] = make_pair(0, 0);
        Check[exit[i]] = 2;
    }
    for (int i = 0; i < k; i++)
    {
        auto node = Tree[exit[i]];
        bloom(node, Choice, Check, Q);
    }    

    while (!Q.empty())
    {
        auto A = Q.top();
        Q.pop();
     
        switch(Check[A.end])
        {
            case 0:{ Choice[A.end].first = A.cost; break; }
            case 1:{ 
                Choice[A.end].second = A.cost; 
                bloom(Tree[A.end], Choice, Check, Q);                
            break; }
        }
        Check[A.end]++;
    }

    return Choice[0].second;
}

Compilation message (stderr)

crocodile.cpp: In function 'void bloom(nod*, std::vector<std::pair<int, int> >&, std::vector<int>&, std::priority_queue<muchie, std::vector<muchie>, bool (*)(muchie, muchie)>&)':
crocodile.cpp:28:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<nod*>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   28 |     for (int i = 0; i < node->Ch.size(); i++)
      |                     ~~^~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...