zoukankan      html  css  js  c++  java
  • SDUT2013级測试赛_D

    题目描写叙述

    给出一棵含有n个点的树。每一个点权值为wi。求从根节点到叶子结点权值和最大的那条路经的权值和是多少。

    输入

    n(1<= n && n <= 10000)

    接下来n+1行,每行两个整数w(w <= 1000)

    i个节点的父节点为w,若 i为根节点。600组数据。

    输出

     对于每组数据,输出一个数代表答案。

    演示样例输入

    3
    0 5
    1 5
    1 6

    演示样例输出

    11

    提示

     

    来源

     解题报告
    求从根节点出发到叶子的最长路。

    。非常像数塔。。

    我暴力dfs过了.怒搜全部数枝,搜完答案就有了。

    。。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    struct node
    {
        int v,next;
    } edge[100000];
    int head[10010],cnt,vv[10010],vis[10010],n,maxx;
    void add(int u,int v)
    {
        edge[cnt].v=v;
        edge[cnt].next=head[u];
        head[u]=cnt++;
    }
    void dfs(int s,int d)
    {
        int i,j;
        for(i=head[s]; i!=-1; i=edge[i].next)
            dfs(edge[i].v,d+vv[edge[i].v]);
        if(d>maxx)
            maxx=d;
    }
    int main()
    {
        int i,j,v,w;
        while(~scanf("%d",&n))
        {
            maxx=0;
            cnt=0;
            memset(edge,0,sizeof(edge));
            memset(vv,0,sizeof(vv));
            memset(head,-1,sizeof(head));
            for(i=0; i<n; i++)
            {
                scanf("%d%d",&v,&w);
                add(v-1,i);
                vv[i]=w;
            }
            dfs(0,vv[0]);
            printf("%d
    ",maxx);
        }
        return 0;
    }
    

    学长标程好像跟数塔类似,从下至上的找最大的。。

    以下是啸爷的标程。。。
    #include <algorithm>
    #include <iostream>
    #include <cstring>
    #include <cstdlib>
    #include <cstdio>
    #include <queue>
    #include <cmath>
    #include <stack>
    #include <map>
    
    #pragma comment(linker, "/STACK:1024000000");
    #define EPS (1e-8)
    #define LL long long
    #define ULL unsigned long long
    #define _LL __int64
    #define _INF 0x3f3f3f3f
    #define Mod 9999991
    
    using namespace std;
    
    int head[10010];
    
    struct E
    {
        int v,next;
    }edge[10010];
    
    int Top;
    
    int Link(int u,int v)
    {
        edge[Top].v = v;
        edge[Top].next = head[u];
        head[u] = Top++;
    }
    
    int value[10010];
    
    int dfs(int root)
    {
        int temp = 0;
    
        for(int p = head[root];p != -1; p = edge[p].next)
        {
            temp = max(temp,dfs(edge[p].v));
        }
    
        value[root] += temp;
    
        return value[root];
    }
    
    int main()
    {
        freopen("data1.in","r",stdin);
        freopen("data1.out","w",stdout);
        int n,i,j,v,w;
    
        while(scanf("%d",&n) != EOF)
        {
            memset(head,-1,sizeof(head));
            Top = 0;
    
            for(i = 1;i <= n; ++i)
            {
                scanf("%d %d",&v,&w);
                Link(v,i);
                value[i] = w;
            }
    
            printf("%d
    ",dfs(1));
        }
        return 0;
    }
    


  • 相关阅读:
    FxCopCmd.exe 返回错误代码 65[翻译]
    关于VS2005安装项目制作的三个参考文章链接
    Windows服务开发的四个小经验
    ThreadLocal详解
    java修饰符详解
    聚合、组合、关联、继承之间的区别【转】
    centos单用户模式修改ROOT密码
    vim的配置
    spring注解详解
    centOS修改文本界面分辨率
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/6744957.html
Copyright © 2011-2022 走看看