Pagini recente » Cod sursa (job #1560853) | Cod sursa (job #1278377) | Cod sursa (job #1044482) | Cod sursa (job #782157)
Cod sursa(job #782157)
#include <cstdio>
const unsigned int MAX_SIZE(16001);
const signed int MIN_COST(-1000);
signed int cost [MAX_SIZE];
struct list
{
unsigned int neighbor;
struct list *next;
};
struct list *graph [MAX_SIZE];
bool visited [MAX_SIZE];
void DepthFirstSearch (unsigned int vertex)
{
visited[vertex] = true;
for (struct list *iterator(graph[vertex]) ; iterator ; iterator = iterator->next)
{
if (visited[iterator->neighbor])
continue;
unsigned int neighbor(iterator->neighbor);
DepthFirstSearch(neighbor);
if (cost[neighbor] > 0)
cost[vertex] += cost[neighbor];
}
}
int main (void)
{
std::freopen("asmax.in","r",stdin);
std::freopen("asmax.out","w",stdout);
unsigned int n;
std::scanf("%d",&n);
signed int *iterator(cost + 1), *end(cost + n);
do
{
std::scanf("%d",iterator);
++iterator;
}
while (iterator <= end);
unsigned int node1, *node1_ptr(&node1), node2, *node2_ptr(&node2);
struct list *new_path;
do
{
std::scanf("%u %u",node1_ptr,node2_ptr);
new_path = new struct list;
new_path->neighbor = node2;
new_path->next = graph[node1];
graph[node1] = new_path;
new_path = new struct list;
new_path->neighbor = node1;
new_path->next = graph[node2];
graph[node2] = new_path;
--n;
}
while (n > 1);
std::fclose(stdin);
DepthFirstSearch(1);
iterator = cost;
signed int min_cost(-(2 << 30));
do
{
if (*iterator > min_cost)
min_cost = *iterator;
++iterator;
}
while (iterator <= end);
std::printf("%d\n",min_cost);
std::fclose(stdout);
return 0;
}