• 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;
    }
    


  • 相关阅读:
    python操作MYSQL时防止SQL注入
    防止SQL注入的一些解决方法
    Gitbook 学习链接
    MySQL_编码utf8_bin和utf8_general_ci的区别
    使用linux脚本shell检查大数据各节点服务是否运行正常
    shell脚本监测elasticsearch集群节点
    Filebeat+Kafka+Logstash+ElasticSearch+Kibana搭建日志收集系统
    python中集合用法大全
    python常用内置函数
    跨模块全局变量的使用问题
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/6744957.html
Copyright © 2020-2023  润新知