Given a directed graph where each edge is represented by a tuple, such as [u, v, w]represents an edge with a weight w from u to v.
You need to calculate at least the need to add the number of edges to ensure that each point of the weight are balancing. That is, the sum of weight of the edge pointing to this point is equal to the sum of weight of the edge of the point that points to the other point.
注意事项
1.Note that u ≠ v and w > 0.
2.index may not be linear, e.g. we could have the points 0, 1, 2 or we could also have the points 0, 2, 6.
样例:
For example:
Given a graph [[0,1,10],[2,0,5]]
Return 2
Two edges are need to added. There are [1,0,5] and [1,2,5]
Given a graph [[0,1,10],[1,0,1],[1,2,5],[2,0,5]]
Return 1
Only one edge need to added. There is [1,0,4]
递归,只能AC61%
#ifndef C707_H
#define C707_H
#include<iostream>
#include<vector>
#include<map>
using namespace std;
class Solution {
public:
/*
* @param edges: a directed graph where each edge is represented by a tuple
* @return: the number of edges
*/
int balanceGraph(vector<vector<int>> &edges) {
// Write your code here
if (edges.empty())
return 0;
map<int, int> m;
for (auto c : edges)
{
m[c[0]] -= c[2];
m[c[1]] += c[2];
}
vector<int> res;
for (auto t : m)
{
if (t.second != 0)
res.push_back(t.second);
}
return helper(res, 0, 0);
}
int helper(vector<int> &res, int start, int cnt)
{
int num = INT_MAX;
int len = res.size();
while (start < len&&res[start] == 0)
start++;
for (int i = start + 1; i < len; ++i)
{
if ((res[start]>0 && res[i] < 0) || (res[start]<0 && res[i]>0))
{
res[i] += res[start];
num = minVal(num, helper(res, start + 1, cnt + 1));
res[i] -= res[start];
}
}
return num == INT_MAX ? cnt : num;
}
int minVal(int a, int b)
{
return a < b ? a : b;
}
};
#endif