Cod sursa(job #2377081)

Utilizator Cristian25Cristian Stanciu Cristian25 Data 8 martie 2019 21:32:52
Problema Asmax Scor 30
Compilator cpp-64 Status done
Runda pregatire_cls12_oji Marime 1.36 kb
#include <bits/stdc++.h>
#define NMAX 16010
#define pb push_back
#define maxx(a, b) (a >= b ? a : b)

using namespace std;

ifstream in("asmax.in");
ofstream out("asmax.out");

vector<long long> v[NMAX];

long long N, c[NMAX], sol[NMAX], cmax;
bool okok;

bool ebun(long long k)
{
    if(k == 1)
        return true;
    for(long long i = 1; i < k;)
        if(sol[k] == sol[i++])
            return false;
    for(long long i = 1; i < k; ++i)
        if(find(v[sol[i]].begin(), v[sol[i]].end(), sol[k]) != v[sol[i]].end() || find(v[sol[k]].begin(), v[sol[k]].end(), sol[i]) != v[sol[k]].end())
            return true;
    return false;
}

long long val(long long k)
{
    long long sum = 0;
    for(long long i = 1; i <= k;)
        sum += c[sol[i++]];
    return sum;
}

void back(long long k)
{
    for(long long i = 1; i <= N; ++i)
    {
        sol[k] = i;
        if(ebun(k))
        {
            cmax = (!okok ? val(k) : maxx(cmax, val(k)));
            okok |= 1;
            if(k < N)
                back(k + 1);
        }
    }
}

int main()
{
    in >> N;
    for(long long i = 1; i <= N;)
        in >> c[i++];
    for(long long i = 1; i < N; ++i)
    {
        long long x, y;
        in >> x >> y;
        if(x > y)
            swap(x, y);
        v[x].pb(y);
    }
    back(1);
    out << cmax;
    return 0;
}