樹的直徑問題

我先整理一下吧,不整理的話搞不好過兩天我自己都忘了
樹的直徑是指一顆樹上距離最遠的兩個點之間的距離。也叫樹的最長路
樹的直徑是指樹的最長簡單路。
求法: 兩遍BFS :先任選一個起點BFS找到最長路的終點,再從終點進行BFS,則第二次BFS找到的最長路即為樹的直徑;

原理: 設起點為u,第一次BFS找到的終點v一定是樹的直徑的一個端點

證明:

  1. 如果u 是直徑上的點,則v顯然是直徑的終點(因為如果v不是的話,則必定存在另一個點w使得u到w的距離更長,則于BFS找到了v矛盾)
  2. 如果u不是直徑上的點,則u到v必然于樹的直徑相交(反證),那么交點到v 必然就是直徑的后半段了
    所以v一定是直徑的一個端點,所以從v進行BFS得到的一定是直徑長度
    bfs寫法
LL d[2][maxn];
queue<int > Q;
int bfs(int u,int idx)   //樹的直徑
{
    memset(d[idx],-1,sizeof(d[idx]));
    while(!Q.empty()) Q.pop();
    d[idx][u] = 0;
    Q.push(u);
    while(!Q.empty())
    {
        int u = Q.front();
        Q.pop();
        for(int i = hd2[u];~i;i = e[i].next)
        {
            if(d[idx][e[i].v]==-1)
            {
                d[idx][e[i].v] = d[idx][u] + e[i].w;
                Q.push(e[i].v);
            }
        }
    }
    LL ret = -1;
    int id = 0;
    for(int i=1;i<=cnt;i++)
        if(ret < d[idx][i]) ret = d[idx][id = i];
    return id;
}

dfs寫法

void TreeDia(int u,int pre,int len)
{
    if(len > max_len) st = u,max_len = len;
    for(int i=0;i<g[u].size();i++)
    {
        int v = g[u][i].v;
        if(v==pre)  continue;
        TreeDia(v,u,len+g[u][i].w);
    }
}

還是dfs好寫o((>ω< ))o

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 歸去來兮。 1.1 說明 本篇為《挑戰(zhàn)程序設計競賽(第2版)》[http://www.ituring.com.cn...
    尤汐Yogy閱讀 14,884評論 0 160
  • 圖的表示 圖的記號是G = (V, E), 可以用兩種數(shù)據(jù)結(jié)構(gòu)表示: 鄰接鏈表和鄰接矩陣; note: 實際應用中...
    陳碼工閱讀 1,018評論 0 2
  • 課程介紹 先修課:概率統(tǒng)計,程序設計實習,集合論與圖論 后續(xù)課:算法分析與設計,編譯原理,操作系統(tǒng),數(shù)據(jù)庫概論,人...
    ShellyWhen閱讀 2,462評論 0 3
  • 沒了云朵,天變得瓦藍瓦藍; 少了積塵,鏡子里也看見了親人。 所謂的藍,所謂的良, 只是個說法; 世界,也本應是這個...
    石竹閱讀 287評論 16 4
  • Mindly 如果你也是視覺思考類型,你會愛上 Mindly 的工作方式,大腦也會在潛移默化中Stronger A...
    腳猾的狐貍閱讀 1,253評論 2 16

友情鏈接更多精彩內(nèi)容