POJ 1849 Two

来源:互联网 发布:网络分销渠道有哪些 编辑:程序博客网 时间:2024/06/06 15:48

求树的直径要先bfs找到任意起点能走到的最远的点,然后再以找到的点为起点bfs。
本题要求两点遍历树,实际是求两倍权和-树的直径,证明不缀。

//注意拓展点的循环的条件是i != -1还是i != 0. #include<cstdio>#include<queue>#include<cstring>#include<iostream>using namespace std;const int maxn = 100010;int n, s, tot, end;int sum;int st[maxn], d[maxn], vis[maxn];struct node{    int to, w, next;} edge[2*maxn];void in(int u, int v, int w){    edge[++tot].to = v;    edge[tot].w = w;    edge[tot].next = st[u];    st[u] = tot;}int bfs(int start){    memset(vis, 0, sizeof(vis));    d[start] = 0;    int diameter = 0;    queue<int> q;    q.push(start);    vis[start] = 1;    while(!q.empty()){        int u = q.front();        q.pop();        for(int i = st[u]; i != 0; i = edge[i].next){            int v = edge[i].to;            if(!vis[v]){                d[v] = d[u] + edge[i].w;                if(d[v] > diameter){                    diameter = d[v];                    end = v;                }                vis[v] = 1;                q.push(v);            }        }    }    return diameter;}int main(){    cin >> n >> s;    for(int i = 1, u, v, w; i <= n-1; i++){        cin >> u >> v >> w;        sum += w*2;        in(u, v, w);        in(v, u, w);    }    end = s;    bfs(s);    int dia = bfs(end);    cout << sum - dia << endl;    return 0;} 
原创粉丝点击