POJ 1849 Two(求树的直径)

来源:互联网 发布:mac mini更换固态硬盘 编辑:程序博客网 时间:2024/05/17 03:34

题意:

两个人,遍历树上的所有点,付出的最小代价。

分析可知,最小代价即为所有边的权值的2倍减去树的直径。

#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#include <cmath>#include <queue>#include <stack>#include <algorithm>#define LL long longusing namespace std;const int MAXN = 100000 + 10;struct Edge{    int to, next, w;}edges[2 * MAXN];int tot;int head[MAXN];int dis[MAXN];int N, S;void init(){    tot = 0;    memset(head, -1, sizeof(head));}void addedge(int u, int v, int w){    edges[tot].to = v;    edges[tot].next = head[u];    edges[tot].w = w;    head[u] = tot++;}int dfs(int u, int pre = -1){    int ans = u;    for(int i=head[u];i!=-1;i=edges[i].next)    {        int v = edges[i].to;        if(v == pre) continue;        dis[v] = dis[u] + edges[i].w;        int dv = dfs(v, u);        if(dis[ans] < dis[dv]) ans = dv;    }    return ans;}int solve(int u){    dis[u] = 0;    u = dfs(u);    dis[u] = 0;    return dis[dfs(u)];}int main(){    while(scanf("%d%d", &N, &S)!=EOF)    {        int u, v, w;        init();        int ans = 0;        for(int i=1;i<N;i++)        {            scanf("%d%d%d", &u, &v, &w);            addedge(u, v, w);            addedge(v, u, w);            ans += w;        }        int D = solve(1);        ans = ans * 2 - D;        cout << ans << endl;    }    return 0;}

0 0