Sicily 1024 Magic Island

来源:互联网 发布:淘宝登录网 编辑:程序博客网 时间:2024/06/05 08:08

    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

原创粉丝点击