Pagini recente » Cod sursa (job #772648) | Autentificare | Cod sursa (job #353206) | Cod sursa (job #1210244) | Cod sursa (job #2377069)
#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;
}