題意爲求一棵樹中的最長路徑。這裏採用兩次BFS的辦法。任選一個結點作爲根結點, 記爲A。以A爲起點進行一次BFS,可以證明,最遠路徑的端點一定是離A最遠的點。證明如下:
若A是最遠路徑的一個端點,則距離A最遠的點也一定是最遠路徑的端點;
若A不是最遠路徑的端點,設一條最遠路徑爲BC,A連接到BC之間的一點,假設BC都不是離A最遠的點,設最遠點爲D,則可證明DB和DC均比BC長,矛盾。故最遠路徑的端點一定是離A最遠的點。
爲了複習數據結構,簡單寫了個圖的類,結果調試了好久……
// hiho 1050
// Find the length of the longest path in a tree
#include<iostream>
#include<cstdio>
#include<memory.h>
using namespace std;
class graph{
private:
struct edgeNode{
int end;
edgeNode* next;
edgeNode(int e, edgeNode* n = NULL): end(e), next(n) {}
edgeNode(): next(NULL) {}
};
struct verNode{
int vertex; // 有用嗎
edgeNode* head;
int step;
verNode(int v, edgeNode* h = NULL): vertex(v), head(h), step(0) {}
verNode(): head(NULL), step(0) {}
};
verNode* table;
int vSize;
public:
graph(int v){
table = new verNode[v];
vSize = v;
}
~graph(){
int i;
for (i = 0; i <= vSize - 1; i++){
edgeNode* tmp = table[i].head;
while (tmp != NULL){
table[i].head = table[i].head->next;
delete tmp;
tmp = table[i].head;
}
}
delete[] table;
}
void insert(int u, int w){
table[u].head = new edgeNode(w, table[u].head);
table[w].head = new edgeNode(u, table[w].head);
//cout << "Insert " << u << ", " << w << " successfully." << endl;
}
// Return the farthest node away from u
int bfs(int u){
char *flag = new char[vSize + 10];
memset(flag, 0, sizeof(char) * (vSize + 10));
int *queue = new int[vSize + 10];
int front, end;
front = end = 0;
queue[end++] = u;
flag[u] = 1;
table[u].step = 0;
int cur;
//int last;
while (end > front){
cur = queue[front++];
//cout << "dequeue: " << cur << endl;
edgeNode* tmp = table[cur].head;
while (tmp){
if (!flag[tmp->end]){
queue[end++] = tmp->end;
table[tmp->end].step = table[cur].step + 1;
flag[tmp->end] = 1;
}
tmp = tmp->next;
}
}
delete[] flag;
delete[] queue;
return cur; // The last node to dequeue
}
inline int step(int u){
return table[u].step;
}
};
int main(){
int N, i, A, B;
scanf("%d", &N);
graph gp(N);
for (i = 1; i <= N - 1; i++){
scanf("%d%d", &A, &B);
gp.insert(A - 1, B - 1);
}
int cur = gp.bfs(0);
int last = gp.bfs(cur);
cout << gp.step(last) << endl;
return 0;
}
這題當然也可以用DFS來做,有空再補上