树的直径
树上两个点的最远的距离
求法:
想从任意一点a出发,求到达这个点的最远距离b(BFS),再求出到这个点b最远的点C(BFS),这两个点的距离就是树的直径
并查集
一般它处理的是图(其实是解决无向图的)的连通分量问题
核心代码:
int findset(int x)
{
return fa[x]==-1? x : fa[x]=findset(fa[x]);
}
int bind(int u,int v)
{
int fu=findset(u);
int fv=findset(v);
if(fu!=fv)
{
fa[fu]=fv;
return 1;//连通分量少了1个
}
return 0;
}
树状数组
可以进行区间更新,单点查询,跟线段树比较类似
对于一个n元素的数组A[n],可执行如下操作:
Add(I, d):让A[i]变成A[i]+d。
Query(L, R):返回A[L]+A[L+1]+…+A[R]。
代码:
const int maxn=10000+5;//最大元素个数
int n;//元素个数
int c[maxn];//c[i]==A[i]+A[i-1]+...+A[i-lowbit(i)+1]
//返回i的二进制最右边1的值
int lowbit(int i)
{
return i&(-i);
}
//返回A[1]+...A[i]的和
int sum(int i)
{
int res=0;
while(i>0)
{
res += c[i];
i -= lowbit(i);
}
return res;
}
//令A[i] += val
void add(int i,int val)
{
while(i<=n)
{
c[i] += val;
i += lowbit(i);
}
}
今天看的这三个专题,树状数组还有些没看完。。明天继续