总结第210场周赛。
1617. 统计子树中城市之间最大距离
题目的难点我觉着有两个,一个是如何找到不一样的子树,一个是如何计算子树的距离。
对于子树中任意两个点的距离,可以考虑flody算法,实现三重循环的方法实现。这里需要特别注意,因为涉及到加法,因此我们不能把最大值设为MAX_VALUE
这样在加法中会爆整数。
其次对于寻找不一样的子树,其实子树就是把不同的节点组织在一起的。看到数据不是很大,其实可以想到用状态压缩DP的思路解决问题。定义dp[i]
表示i的二进制其实是对应节点组成的树的距离。需要考虑,dp的初始其实就是实际连接的两个节点组成的子树。这个子树肯定是连通的。同时我们注意在每次枚举中,子树的大小是只增加不减小的。
class Solution {
public int[] countSubgraphsForEachDiameter(int n, int[][] edges) {
int N = 1<<n;
int[][] dis = new int[n][n];
int[] dp = new int[N];
for (int i = 0; i<n;i++){
// 这里不能是MAX_VALUE,因为会涉及加法。
Arrays.fill(dis[i], Integer.MAX_VALUE/2);
//dis[i][i] = 0;
}
for (int[] e:edges){
int a = e[0]-1;
int b = e[1]-