problem:1301
time limit:1000ms
memory limit:65535k
樹的直徑是指樹的最長簡單路。我們通常通過兩遍bfs or dfs得到。即先任選乙個起點bfs or dfs找到最長路的終點,再從終點進行bfs or dfs,則第二次找到的最長路即為樹的直徑。現給出一棵樹,求樹的直徑。
第一行輸入乙個整數 t( t <= 10 ) ,代表樣例的個數。對於每組樣例
第一行輸入樹的頂點數 n (1<=n<=1e5)
接下來 n - 1 行,每行包含兩個數 x y ,代表頂點 x 和 y 之間有一條邊(x,y <= n)
乙個整數,樹的直徑的長度
291 2
1 32 4
2 53 6
6 86 7
8 99
1 21 3
2 42 5
3 63 7
6 86 9
76
題意:中文題。
思路:用兩次bfs來遍歷樹,第二次得到的就是樹長度最大的。也就是樹的直徑。
**:
#include #include #include #include #include using namespace std;
const int inf=0x3f3f3f3f;
int maxi;
int maxn;
struct node
q[100005];
int d[100005];
void bfs(int now)
que.push(q[u].next[i]);}}
}int main()
memset(d,inf,sizeof(d));
maxn=0;
d[1]=0;
bfs(1);
maxn=0;
memset(d,inf,sizeof(d));
d[maxi]=0;
bfs(maxi);
printf("%d\n",maxn+1);
}return 0;
}
樹的直徑(兩個bfs)
樹的直徑 樹中的最長鏈 具體思路 隨便找乙個點bfs,然後找到最長的鏈,然後再以找到的點作為起點進行bfs,然後找到的最長的鏈就是樹的直徑。ac include include include include include include include include include inclu...
樹的直徑(兩個bfs)
樹的直徑 樹中的最長鏈 具體思路 隨便找乙個點bfs,然後找到最長的鏈,然後再以找到的點作為起點進行bfs,然後找到的最長的鏈就是樹的直徑。ac include include include include include include include include include inclu...
兩次BFS求樹的直徑 演算法導論22 2 7
以任意點w開始,先做一次bfs,找到最遠的點v,然後再以此點v進行一次bfs,找到最遠的點為u,u到v就是樹的直徑。此問題的關鍵不是在程式設計,而是要證明,網上也找了很多資料,沒有看到證明,以下是個人的證明方法。首先要知道樹是沒有環路的連通圖,任意兩點都有一條通路,而且也只有一條通路。同時假設樹的一...