Lukelabs OJ刷题——Z1013

news/2024/6/2 21:22:21 标签: 算法

文章目录

  • 题意简述
    • 题目背景
    • 输入
    • 输出
  • 思路
  • 代码
  • 结语

题意简述

题目背景

有一个骑士团,共有 N N N名骑士,每个骑士都有一个武力值和一个最讨厌的骑士(不是他自己),他无法和自己最讨厌的骑士战斗。

现在请你求出骑士团上场时的武力最大值。

输入

输入第一行包含一个正整数 N N N,描述骑士团的人数;

接下来 N N N 行每行两个正整数,按顺序描述每一名骑士的战斗力和他最痛恨的骑士。

输出

输出包含一行,一个整数,表示你所选出的骑士军团的战斗力。

思路

这题是一个很裸的树形DP,但是坑点很多。

思路:我们把一个骑士和他憎恨的骑士连边,很显然这会构成一个由基环树组成的森林

我们对这个基环树森林进行树形DP(类似于没有上司的舞会),对于每一棵基环树,任意相连的两个点不能同时取。

众所周知,要使一棵基环树转化为一棵树,必须要断掉其环上的一条边。

我们考虑环上的任意一条边,它的两个端点至少有一个不取。则分别以两个端点为根进行树形DP,分别存在 f f f数组和 g g g数组中。

d p [ i ] [ j ] dp[i][j] dp[i][j]的第一维表示以 i i i为根节点的子树中,当前节点 i i i取或不取的武力最大值( j j j 0 0 0时表示不取,为 1 1 1时表示取)。

我们可以发现,对于每一条环上的边,它的贡献相同,令任意边两端点分别为 x 1 , x 2 x1, x2 x1,x2,则对每个基环树(联通块)将答案累加上 m a x ( f [ x 1 ] [ 0 ] , g [ x 2 ] [ 0 ] ) max(f[x1][0],g[x2][0]) max(f[x1][0],g[x2][0])即可

注意以下几个坑点:

  • 要开 l o n g l o n g long long longlong
  • 组成的是基环树森林而非单棵基环树
  • 判断不走断开的边时必须用边来判断,不能用点,因为两个骑士可能相互憎恨,形成重边,这时如果判断点,会造成树不联通。

代码

#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define PII pair<int, int>
#define For(i, a, b) for(int i = a;i <= b;i++)
const int N = 1e6 + 10;
int happy[N];
long long f[N][2];
struct node{
    int next, to, v;
} e[2 * N - 10];
int st[N], n, s, tot, x1, x2, E, b;
bool vis[N];
void add(int x, int y){
    e[tot].to = y, e[tot].next = st[x], st[x] = tot++;
    e[tot].to = x, e[tot].next = st[y], st[y] = tot++;
}
void find_circle(int x, int pre){
    vis[x] = true;
    for (int i = st[x]; ~i; i = e[i].next){
        if ((i ^ 1) == pre){
            continue;
        }
        if (vis[e[i].to]){
            x1 = x, x2 = e[i].to;
            E = i;
            continue;
        }
        find_circle(e[i].to, i);
    }
}
void dfs(int x, int pre){
    f[x][0] = 0;
    f[x][1] = happy[x];
    for (int i = st[x]; ~i; i = e[i].next){
        if ((i ^ 1) == pre){
            continue;
        }
        if (i == E || (i ^ 1) == E){
            continue;
        }
        dfs(e[i].to, i);
        f[x][1] += f[e[i].to][0];
        f[x][0] += max(f[e[i].to][1], f[e[i].to][0]);
    }
}
signed main(){
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    cin >> n;
    For (i, 1, n){
        st[i] = -1;
    }
    for (int i = 1; i <= n; i++){
        cin >> happy[i] >> b;
        add(i, b);
    }
    long long ans = 0;
    for (int i = 1; i <= n; i++){
        if (vis[i]){
            continue;
        }
        find_circle(i, -2);
        dfs(x1, -1);
        long long temp = f[x1][0];
        dfs(x2, -1);
        temp = max(temp, f[x2][0]);
        ans += temp;
    }
    cout << ans;
}

结语

今天的文章就到这里啦,三连必回哦!


http://www.niftyadmin.cn/n/5286560.html

相关文章

Electron自定义通知Notification

Notification是什么&#xff1f; 对于渲染进程&#xff0c;Electron 允许开发者使用通知中API&#xff0c;来运行系统的原生通知进行显示。 如何实现系统Notification&#xff1f; const { Notification } require(electron);const isAllowed Notification.isSupported();…

Java类的静态初始化需要注意什么?

1、Java类的静态初始化是什么 Java中的静态初始化是指使用 static 关键字定义的代码块&#xff0c;它在类加载时执行&#xff0c;而且在整个类生命周期中只会执行一次。 静态初始化块通常用于对类的静态成员&#xff08;即类变量&#xff09;进行初始化&#xff0c;还可以执行…

【网络安全 | MD5截断比较】PHP、Python脚本利用

前言 在解题中&#xff0c;当遇到类似 substr(md5(a),-6,6) 7788这样的MD5截断比较的题目时&#xff0c;只有求出a的值才能进行接下来的操作。 一个一个去猜是不可能的&#xff0c;通常使用脚本解决&#xff0c;文末给出实战案例。 PHP循环脚本 <?phpfor($i1;$i<9…

在Android中使用Flow获取网络连接信息

在Android中使用Flow获取网络连接信息 如果你是一名Android开发者&#xff0c;你可能会对这个主题感到有趣。考虑到几乎每个应用程序都需要数据交换&#xff0c;例如刷新动态或上传/下载内容。而互联网连接对此至关重要。但是&#xff0c;当用户的设备离线时&#xff0c;数据如…

面向 AI,重塑云基础设施、存储、芯片、Serverless……2023亚马逊云科技re:Invent中国行

一年一度亚马逊云科技重要的技术盛会 re:Invent 刚落下帷幕&#xff0c;2023 亚马逊云科技 re:Invent 中国行就将其中重要的信息与内容带给了中国市场和用户。作为全球的云计算巨头&#xff0c;今年亚马逊云科技可以说全面加码 AI&#xff0c;例如发布完整的端到端生成式 AI 技…

ioDraw AI:思维导图、流程图、序列图、类图、饼图,一应俱全

前言 在信息爆炸的时代&#xff0c;我们每天接收着大量的信息&#xff0c;如何高效地整理和呈现这些信息成为了一项重要的挑战。思维导图作为一种可视化思维工具&#xff0c;能够帮助我们快速构建和整理复杂的信息结构&#xff0c;便于我们理解和记忆。ioDraw AI绘图工具正是基…

1.决策树

目录 1. 什么是决策树? 2. 决策树的原理 2.1 如何构建决策树&#xff1f; 2.2 构建决策树的数据算法 2.2.1 信息熵 2.2.2 ID3算法 2.2.2.1 信息的定义 2.2.2.2 信息增益 2.2.2.3 ID3算法举例 2.2.2.4 ID3算法优缺点 2.2.3 C4.5算法 2.2.3.1 C4.5算法举例 3. 未完待续。。。 4.…

Python与ArcGIS系列(十七)GDAL之shp转geojson

目录 0 简述1 Shapefile (SHP) 格式2 GeoJSON 格式3 代码实现0 简述 Shp格式是GIS中非常重要的数据格式,主要在Arcgis中使用,但在进行很多基于网页的空间数据可视化时,通常只接受GeoJSON格式的数据,众所周知JSON是利用键值对+嵌套来表示数据的一种格式,以其轻量、易解析的…