蓝桥杯----图论训练

发布时间 2023-06-01 23:37:42作者: 次林梦叶

STL

  当想要维护一个数组,其中的元素要求有序,同时可能随时对这个数组中的元素进行增减

  有没有一个STL可以快速维护一个这样的数组?

  multiset(平衡二叉树)

   默认从小到大排序

  

  注意离散化中清除重复元素的原理:

  unique()函数

       

    vector中的earse是删除指定一段,所以离散化有:

 

《树的直径》

  什么是树的直径?

    在一颗树上,两个叶子节点之间的最长距离下的路径

     证明方式<------

 如何dfs?

void dfs(int node,int fa)
{
    if (maxL<deep[node])
        d=node,maxL=deep[node];    
    for (int i=0;i<sides[node].size();i++)
    {
        int child=sides[node][i];
        if (child==fa) continue;
        deep[child]=deep[node]+1;
        road[child]=node;
        dfs(child,node);
    }
}

d为我们要求的端点,每一次只要深度有更深的点我们就更新

 

  

 如何用拓扑排序的方式将叶子节点一圈一圈地给“减掉”?

双队列的方式,其中有个十分神奇的用法:

  queue<int>q1,q2;

  swap(q1,q2);

  没想到swap可以直接交换队列

while (sum)
    {
        if (sum<=k)
            break;
        ans++;
        while (q1.size())
        {
            int node=q1.front();
            q1.pop();
            sum--;
            for (int i=0;i<sides[node].size();i++)
            {
                int next=sides[node][i];
                if (du[next]<=1)
                    continue;
                du[next]--;
                if (du[next]==1)
                    q2.push(next);
            }
        }
        swap(q1,q2);
    }