题目描述

$ρ$有一个二分连通无向图,$X$方点、$Y$方点均为$n$个(编号为$1\sim n$)。
这个二分图比较特殊,每一个$Y$方点的度为$2$,一条黑色边,一条白色边。
所有黑色边权值均为$a$,所有白色边权值均为$b$。
选择一个$X$方点,代价为连接的所有边的权值之和。
激活一个$Y$方点,需要选择至少一个与之相邻的$X$方点。
现在,$ρ$想激活每个$Y$方点,他想知道最小的总代价。
不过$ρ$很善良,他给你开了$O2$优化。
这样你就不会被卡常了。
当然,除非你真的连读入优化都不想写,或者常数真的丑死。


输入格式

第一行:三个正整数$n$、$a$、$b$。
接下来$n$行:每行两个正整数,第$i$行表示第$i-1$个$Y$方点的黑色边连接的$X$方点,白色边连接的$X$方点。


输出格式

第一行:一个整数,代表最小的总代价。


样例

样例输入:

4 2 3
1 2
3 1
1 4
2 3

样例输出:

12


数据范围与提示

$20\%$的数据:$n\leqslant 20$。
$40\%$的数据:$n\leqslant {10}^3$。
另外$10\%$的数据:$a=b=1$。
另外$20\%$的数据:保证每个$X$方点连接的边颜色相同。
另外$10\%$的数据:保证原图是一个大小为$2\times n$的环。
$100\%$的数据:$n\leqslant {10}^6,a,b\leqslant 100$,保证无重边。


题解

发现这张图其实就是一个基环树,所以我们可以做基环树$DP$。

首先,找到这个环,然后删掉这条边,这样就变成了一棵树了,向两个方向进行$DP$,取较小的即可。

时间复杂度:$\Theta(n)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
struct rec{int nxt,to;}e[2000001];
struct node{int i,l,r;}root;
int head[1000001],cnt=1;
int n,a,b;
int sam[1000001];
int dp[2][1000001][2];
bool vis[1000001];
void add(int x,int y)
{
e[++cnt].nxt=head[x];
e[cnt].to=y;
head[x]=cnt;
}
void pre_dfs(int x,int fa)
{
vis[x]=1;
for(int i=head[x];i;i=e[i].nxt)
{
if(e[i].to==fa)continue;
if(vis[e[i].to]){root=(node){i,x,e[i].to};return;}
pre_dfs(e[i].to,x);
}
}
void DP0(int x,int fa)
{
int sum=0;
dp[0][x][0]=0;
dp[0][x][1]=sam[x];
for(int i=head[x];i;i=e[i].nxt)
{
if(i==root.i||(i^1)==root.i||e[i].to==fa)continue;
DP0(e[i].to,x);
sum+=min(dp[0][e[i].to][0],dp[0][e[i].to][1]);
dp[0][x][0]+=dp[0][e[i].to][1];
}
dp[0][x][1]+=sum;
}
void DP1(int x,int fa)
{
int sum=0;
dp[1][x][0]=0;
dp[1][x][1]=sam[x];
for(int i=head[x];i;i=e[i].nxt)
{
if(i==root.i||(i^1)==root.i||e[i].to==fa)continue;
DP1(e[i].to,x);
sum+=min(dp[1][e[i].to][0],dp[1][e[i].to][1]);
dp[1][x][0]+=dp[1][e[i].to][1];
}
dp[1][x][1]+=sum;
}
int main()
{
scanf("%d%d%d",&n,&a,&b);
for(int i=1;i<=n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
sam[x]+=a;sam[y]+=b;
add(x,y);add(y,x);
}
pre_dfs(1,0);
DP0(root.l,0);
DP1(root.r,0);
cout<<min(dp[0][root.l][1],dp[1][root.r][1])<<endl;
return 0;
}

rp++

[CSP-S模拟测试]:卡常题/b(基环树+DP)的更多相关文章

  1. NOIP模拟测试39,思维禁锢专场「工业题·玄学题·卡常题」

    工业题 题解 抱歉,题解没时间写了 代码 #include<bits/stdc++.h> using namespace std; #define ll long long #define ...

  2. Codeforces 986D - Perfect Encoding(FFT+爪巴卡常题)

    题面传送门 题意:给出 \(n\),构造出序列 \(b_1,b_2,\dots,b_m\) 使得 \(\prod\limits_{i=1}^mb_i\geq n\),求 \(\sum\limits_{ ...

  3. [CSP-S模拟测试]:小L的数(数位DP+模拟)

    题目传送门(内部题132) 输入格式 第一行一个整数$t$. 接下来$t$行每行一个整数$n$. 输出格式 $t$行,每行一个整数表示答案. 样例 样例输入: 41818231232691052109 ...

  4. 联赛模拟测试5 涂色游戏 矩阵优化DP

    题目描述 分析 定义出\(dp[i][j]\)为第\(i\)列涂\(j\)种颜色的方案数 然后我们要解决几个问题 首先是求出某一列涂恰好\(i\)种颜色的方案数\(d[i]\) 如果没有限制必须涂\( ...

  5. NOIP 模拟 $13\; \text{卡常题}$

    题解 一道环套树的最小点覆盖题目,所谓环套树就是有在 \(n\) 个点 \(n\) 条边的无向联通图中存在一个环 我们可以发现其去掉一条环上的边后就是一棵树 那么对于此题,我们把所有 \(x\) 方点 ...

  6. NOIP模拟13「工业题·卡常题·玄学题」

    T1:工业题 基本思路   这题有一个重要的小转化: 我们将原来的函数看作一个矩阵,\(f(i,j-1)*a\)相当于从\(j-1\)向右走一步并贡献a,\(f(i-1,j)*b\)相当于从\(i-1 ...

  7. [CSP-S模拟测试]:联(小清新线段树)

    题目描述 由于出题人懒所以没有背景.一个无限长的$01$序列,初始全为$0$,每次选择一个区间$[l,r]$进行操作,有三种操作:$\bullet 1\ l\ r$将$[l,r]$中所有元素变成$1$ ...

  8. [CSP-S模拟测试]:Cover(单调栈++单调队列+DP)

    题目传送门(内部题126) 输入格式 第一行两个个整数$n,m$表示区间的长度与彩灯的数量. 接下来$m$行,每行三个整数$l_i,r_i,a_i$表示一条彩灯能够覆盖的区间以及它的美观程度. 输出格 ...

  9. [CSP-S模拟测试]:购物(柯朵莉树)

    题目描述 $visit_world$有一个商店,商店里卖$N$个商品,第$i$个的价格为$a[i]$我们称一个正整数$K$是美妙的,当且仅当我们可以在商店里选购若干个商品,使得价格之和落在区间$[K, ...

随机推荐

  1. yifan的数组

    yifan的数组 时间限制: 1 Sec  内存限制: 128 MB提交: 159  解决: 47[提交][状态] 题目描述 给你一个数组,初始值都是0,然后有N个操作,每次在一段区间L,R上加W,操 ...

  2. 纯CSS 常见3D实例

    一.正方体 我认为正方体可以算是3D图像的基础吧,首先正方体是由六个相同的面所组成,其次就需要我们依次构造.(据体构造在代码中)成平图如下: 代码如下: <!DOCTYPE html> & ...

  3. JSON的android应用实例

    JSON的android应用实例 Json在线解析器 下面是直接通过JUnit来测试直接通过API来解析Json数据 1.普通键值对象 2.Json数组对象 3.Json数组对象

  4. (64)C# 预处理器指令

    预处理器命令从来不会被翻译为可执行代码中的命令,但会影响编译过程的各个方面.例如:使用预处理器指令可以禁止编译器编译代码的某一部分,如果计划发布两个版本的代码,即基本版本和有更多功能的企业版本,即可以 ...

  5. 用 Flask 来写个轻博客 (33) — 使用 Flask-RESTful 来构建 RESTful API 之二

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 构建 RESTful Flask API 定义资源路由 格式 ...

  6. Python 进阶_闭包 & 装饰器

    目录 目录 闭包 函数的实质和属性 闭包有什么好处 小结 装饰器 更加深入的看看装饰器的执行过程 带参数的装饰器 装饰器的叠加 小结 装饰器能解决什么问题 小结 闭包 Closure: 如果内层函数引 ...

  7. idea下web工程的编译和输出设置

    公司的一个项目,别人用的eclipse,我这边用IDEA,路径上出了点问题,现在大概有点头绪了,记录下来. 打开project structure后,看到如下设置,最重要的是Modules和Artif ...

  8. Java基本数据类型内存分配

    1.java程序运行时有6中地方存储数据,分别是:寄存器.栈.堆.静态存储.常量存储.非RAM(随机存储器),主要是堆与栈的存储.   2.堆与栈是java用来在RAM中存储数据的地方,java自动管 ...

  9. 在Windows及Linux下获取毫秒级运行时间的方法

    在Windows下获取毫秒级运行时间的方法 头文件:<Windows.h> 函数原型: /*获取时钟频率,保存在结构LARGE_INTEGER中***/ WINBASEAPI BOOL W ...

  10. 《单词的减法》state1~state17(200p)

    单词的减法 2016.05.18 state 1 absent accessible accordingly accuracy/accurate acquaint/acquaintance adequ ...