N个结点N-1条边无孤立点,说明这是图的最小生成树。首先将双向边改为单向边,再DFS搜索,两者可同时进行。
#include <iostream>
#include <set>
#include <vector>
using namespace std;
typedef set<pair<int, int> > Node;
void traverse(vector<Node> &tree, int root, int &longest, int pathCost) {
if (tree[root].empty()) {
if (pathCost>longest)
longest=pathCost;
}
else {
for (Node::iterator iter=tree[root].begin();
iter!=tree[root].end(); iter++) {
tree[(*iter).first].erase(make_pair(root, (*iter).second)); // 变双向边为单向边
traverse(tree, (*iter).first, longest, pathCost+(*iter).second); // DFS
}
}
}
int main() {
int N, K;
while (cin>>N) {
cin>>K;
vector<Node> tree(N+1);
while (--N) {
int first, second, distance;
cin>>first>>second>>distance;
tree[first].insert(make_pair(second, distance));
tree[second].insert(make_pair(first, distance));
}
int longest=0;
traverse(tree, K, longest, 0);
cout<<longest<<"\n";
}
return 0;
}
// by wbchou
// Jan 31th , 2013