Cod sursa(job #2377069)

Utilizator Cristian25Cristian Stanciu Cristian25 Data 8 martie 2019 21:26:08
Problema Asmax Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <bits/stdc++.h>
#define NMAX 16001
#define pb push_back
#define maxx(a, b) (a > b ? a : b)

using namespace std;

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

typedef unsigned short ushort;

const int inf = 0x3f3f3f3f;

vector<ushort> v[NMAX];

ushort N;
short c[NMAX], sol[NMAX];
int cmax = -inf;

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

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

void back(ushort k)
{
    for(ushort i = sol[k - 1] + 1; i <= N; ++i)
    {
        sol[k] = i;
        if(ebun(k))
        {
            cmax = maxx(cmax, val(k));
            if(k < N)
                back(k + 1);
        }
    }
}

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