zoukankan      html  css  js  c++  java
  • *[hackerrank]Cut the tree

    https://www.hackerrank.com/contests/w2/challenges/cut-the-tree

    树分成两部分,求两部分差最小。一开始想多了,后来其实求一下总和,求一下分部的和就行了。

    #include <cstdlib>
    #include <climits>
    #include <algorithm>
    #include <iostream>
    #include <vector>
    using namespace std;
    
    vector<vector<int>> tree;
    vector<bool> visited;
    vector<int> val;
    int totalVal;
    
    int subSum(int root, int& minCut) {
    	int sum = 0;
    	visited[root] = true;
    	for (int i = 0; i < tree[root].size(); i++) {
    		int sub = tree[root][i];
    		if (visited[sub])
    			continue;
    		int x = subSum(sub, minCut);
    		sum += x;
    	}
    	sum += val[root];
        minCut = min(minCut, abs(totalVal - 2 * sum));
        return sum;
    }
    int main() {
    	int N;
    	cin >> N;
    	tree.resize(N + 1);
    	visited.resize(N + 1);
    	val.resize(N + 1);
    	totalVal = 0;
    	for (int i = 1; i <= N; i++) {
    		cin >> val[i];
    		totalVal += val[i];
    	}
    	for (int i = 0; i < N - 1; i++) {
    		int a, b;
    		cin >> a >> b;
    		tree[a].push_back(b);
    		tree[b].push_back(a);
    	}
    	int minCut = INT_MAX;
    	// pick 1 as root
    	subSum(1, minCut);
    	cout << minCut << endl;
    	return 0;
    }
    

      

  • 相关阅读:
    《图解CSS3》笔记5 媒体与Responsive设计
    理论篇 前端MVC、MVP、MVVM思考1
    AngularJS篇 $resource使用笔记
    《图解CSS3》笔记4 animation动画
    Prim
    邻接矩阵与邻接表
    差分约束
    SPFA
    floyd
    Kosaraju
  • 原文地址:https://www.cnblogs.com/lautsie/p/3915885.html
Copyright © 2011-2022 走看看