Pagini recente » Cod sursa (job #2270041) | Cod sursa (job #2747570) | Cod sursa (job #2352871) | Cod sursa (job #2359239) | Cod sursa (job #2824883)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
vector < vector<int> > graph;
int number_of_nodes;
vector<int> costs;
void read_graph(char* file){
ifstream f(file);
f >> number_of_nodes;
costs.assign(number_of_nodes + 1, 0);
graph.assign(number_of_nodes + 1, vector<int>());
for(int i = 1; i <= number_of_nodes; i++){
f >> costs[i];
}
for(int i = 1; i <= number_of_nodes - 1; i++){
int x, y;
f >> x >> y;
graph[x].push_back(y);
graph[y].push_back(x);
}
}
int dfs_sum(int node, int& sum, vector<int>& visited){
int sum_current;
sum_current = costs[node];
visited[node] = 1;
for(int i = 0; i < graph[node].size(); i++){
int neighbor;
neighbor = graph[node][i];
if(visited[neighbor] == 0){
int sum_neighbor;
sum_neighbor = dfs_sum(neighbor, sum, visited);
if(sum_current + sum_neighbor > sum_current){
sum_current = sum_current + sum_neighbor;
}
}
}
if(sum_current > sum){
sum = sum_current;
}
return sum_current;
}
int maximum_sum(){
vector<int> visited;
visited.assign(number_of_nodes + 1, 0);
int sum = 0 - (1 << 5);
int result;
result = dfs_sum(1, sum, visited);
return sum;
}
int main() {
ofstream g("../asmax.out");
read_graph("../asmax.in");
g << maximum_sum();
return 0;
}