Pagini recente » Cod sursa (job #1964333) | Cod sursa (job #2161651) | Cod sursa (job #1905563) | Cod sursa (job #2502526) | Cod sursa (job #2377081)
#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;
}