Submission #1326790

#TimeUsernameProblemLanguageResultExecution timeMemory
1326790GabrielTravelling Trader (CCO23_day2problem2)C++20
11 / 25
168 ms40208 KiB
#include "bits/stdc++.h"
using namespace std;
vector< vector<long long> > Grafo;
vector<long long> v, d, a;
vector<int> Final, Tour;
int Hay;
void DFS(int Nodo){
    //cerr<<Nodo<<"\n";
    Hay--;
    Final[Nodo] = Tour.size();
    Tour.push_back(Nodo);
    if(Hay == 0) return;
    for(auto E: Grafo[Nodo]){
        if(Hay == 0) return;
        //cerr<<Nodo<<" "<<E<<"\n";
        if(d[E] > d[Nodo] + v[E]){
            d[E] = d[Nodo] + v[E];
            DFS(E);
            a[E] = Nodo;
            Final[Nodo] = Tour.size();
            Tour.push_back(Nodo);
        }
    }
}
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n, k;
    long long m = 0;
    cin>>n>>k;
    Grafo.assign(n, {});
    v.assign(n, 0);
    d.assign(n, 2222222222222222);
    a.assign(n, -2);
    Final.assign(n, 0);
    Hay = n;
    for(int i = 0; i < n - 1; i++){
        int a, b;
        cin>>a>>b;
        a--;
        b--;
        Grafo[a].push_back(b);
        Grafo[b].push_back(a);
    }
    for(int i = 0; i < n; i++){
        cin>>v[i];
        m += v[i];
    }
    if(k == 1){
        d[0] = v[0];
        DFS(0);
        int p = 0;
        m = 0;
        for(int i = 0; i < n; i++){
            if(d[i] > m){
                m = d[i];
                p = i;
            }
        }
        vector<int> r;
        cout<<m<<"\n";
        while(p != -2){
            r.push_back(p);
            p = a[p];
        }
        reverse(r.begin(), r.end());
        cout<<r.size()<<"\n";
        for(auto E: r) cout<<E + 1<<" ";
        return 0;
    }
    if(k == 3){
        d[0] = v[0];
        DFS(0);
        vector<int> r;
        bitset<222222> Visitados;
        Visitados[0] = 1;
        r.push_back(0);
        Hay = n;
        cout<<m<<"\n"<<n<<"\n";
        n = Tour.size();
        int c = 0;
        for(int i = 1; i < n and Hay > 0; i++){
            if(i == Final[Tour[i]] and !Visitados[Tour[i]]){
                c = 0;
                r.push_back(Tour[i]);
                Visitados[Tour[i]] = 1;
                Hay--;
            } else if(c == 2){
                c = 0;
                r.push_back(Tour[i]);
                Visitados[Tour[i]] = 1;
                Hay--;
            } else c++;
        }
        for(auto E: r) cout<<E + 1<<" ";
        return 0;
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...