hihocoder 1050



        題意爲求一棵樹中的最長路徑。這裏採用兩次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來做,有空再補上


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章