• codeforces 615 B. Longtail Hedgehog (DFS + 剪枝)


    题目链接:

      codeforces 615 B. Longtail Hedgehog (DFS + 剪枝)

    题目描述:

      给定n个点m条无向边的图,设一条节点递增的链末尾节点为u,链上点的个数为P,则该链的beauty值 = P*degree[u]。问你所有链中最大的beauty值。

    解题思路:

      因为只需要找到以每个节点为终点的最长递增链即可,所以建图的时候可以建成从编号小的节点到编号大的节点的有向图,然后用DFS搜索,但是直接暴搜会TLE,然后就开始了我的TLE之路,TLE24, TLE42,TLE56,TLE60.....,准备弃疗时,学弟帮我看了一下,竟然改对了,而且跑得飞快(✪▽✪),就是定义一个标志数组,记录当前节点之前的节点是不是已经遍历完了,如果遍历完了,那么当前节点就是最优的了,就从当前节点向下遍历。新技能get

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <cstdlib>
     4 #include <algorithm>
     5 #include <iostream>
     6 #include <cmath>
     7 #include <queue>
     8 using namespace std;
     9 #define LL __int64
    10 
    11 const LL INF = 1e9+7;
    12 const int maxn = 100010;
    13 struct node
    14 {
    15     int to, next;
    16 } edge[maxn*4];
    17 
    18 
    19 int head[maxn], tot, du[maxn], in[maxn];
    20 LL ans[maxn];
    21 
    22 void add (int from, int to)
    23 {
    24     edge[tot].to = to;
    25     edge[tot].next = head[from];
    26     head[from] = tot ++;
    27 }
    28 /**
    29     记录in[i]为i点的入度
    30     当入度为零时,当前节点更新为最优,
    31     然后从当前节点继续向下遍历
    32     向下遍历时层数参数为当前层加一
    33     而不是简单的上一层参数加一
    34 */
    35 void dfs (int u, LL x)
    36 {
    37     
    38     for (int i=head[u]; i!=-1; i=edge[i].next)
    39     {
    40         int v = edge[i].to;
    41         ans[v] = max (ans[v], x);
    42         in[v]--;
    43 
    44         if(in[v] == 0)
    45             dfs (v, ans[v]+1);
    46     }
    47 }
    48 
    49 int main ()
    50 {
    51     int n, m;
    52 
    53     scanf ("%d %d", &n, &m);
    54     memset (head, -1, sizeof(head));
    55     tot = 0;
    56 
    57     for (int i=0; i<m; i++)
    58     {
    59         int u, v;
    60         scanf ("%d %d", &u, &v);
    61         if(u > v)
    62             swap (u, v);
    63         du[u] ++;
    64         du[v] ++;
    65         in[v]++;
    66         add (u, v);
    67     }
    68 
    69     for (int i=1; i<=n; i++)
    70     {
    71         if (ans[i] == 0)
    72         {
    73             ans[i] = 1;
    74             dfs (i, 2);
    75         }
    76     }
    77 
    78     LL sum = 0;
    79     for (int i=1; i<=n; i++)
    80         sum = max (sum, ans[i] * du[i]);
    81 
    82     printf ("%I64d
    ", sum);
    83     return 0;
    84 }
  • 相关阅读:
    [记录点滴] 一个解决Lua 随机数生成问题的办法
    [源码解析] 从TimeoutException看Flink的心跳机制
    [记录点滴] OpenResty中Redis操作总结
    [记录点滴] 小心 Hadoop Speculative 调度策略
    [源码解析] GroupReduce,GroupCombine 和 Flink SQL group by
    第28 章 : 理解容器运行时接口 CRI
    第27 章 : Kubernetes 安全之访问控制
    第26 章 : 理解 CNI 和 CNI 插件
    第25 章 : Kubernetes 网络模型进阶
    第24 章 : Kubernetes API 编程利器:Operator 和 Operator Framework
  • 原文地址:https://www.cnblogs.com/alihenaixiao/p/5476729.html
Copyright © 2020-2023  润新知