题目链接:https://cn.vjudge.net/problem/HYSBZ-1040

题意

  Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英。

他们劫富济贫,惩恶扬善,受到社会各界的赞扬。

最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争。

战火绵延五里,在和平环境中安逸了数百年的Z国又怎能抵挡的住Y国的军队。

于是人们把所有的希望都寄托在了骑士团的身上,就像期待有一个真龙天子的降生,带领正义打败邪恶。

骑士团是肯定具有打败邪恶势力的能力的,但是骑士们互相之间往往有一些矛盾。

每个骑士都有且仅有一个自己最厌恶的骑士(当然不是他自己),他是绝对不会与自己最厌恶的人一同出征的。

战火绵延,人民生灵涂炭,组织起一个骑士军团加入战斗刻不容缓!

国王交给了你一个艰巨的任务,从所有的骑士中选出一个骑士军团,使得军团内没有矛盾的两人(不存在一个骑士与他最痛恨的人一同被选入骑士军团的情况),并且,使得这支骑士军团最具有战斗力。

为了描述战斗力,我们将骑士按照1至N编号,给每名骑士一个战斗力的估计,一个军团的战斗力为所有骑士的战斗力总和。

思路

注意到这是颗基环树,如果只是一颗树的话这明显是树上的最大独立集。

但是咱可以取掉基环树的圈的一个边,这样就是一棵树,再求端点取值不同或不取的最大独立集即可。

但是现实总是要给你带来一些坑和打击,题中并没有将这是一颗基环树,意思是让你判断连通性。

对每个联通块求一次答案,求和即可。

强烈注意:

  1. 判断联通的写法,讨论是否图中全是基环树
  2. 联通图搜索节点不能强行停止,必须自然停止
  3. 注意判断是否同一条边(有可能还需判断是否有重边)
  4. 初始化前向星
  5. 有向图edges双倍大小
  6. 树上dfs&dp判断父节点fa
  7. ans+=max(data[st][0], data[end][0])

提交过程

WA*n 各种问题,发现细节可弱
WA 注意判断删去的边
RE 注意无向图中edges数组大小双倍
AC

代码

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=1e6+20;
struct Edge{
int to, next;
Edge(int to=0, int next=-1):to(to), next(next) {}
}edges[maxn*2];
int head[maxn], size, n;
long long val[maxn], data[maxn][2];
bool vis[maxn]; void init(void){
memset(head, -1, sizeof(head));
size=0;
} void addEdge(int from, int to){
edges[size]=Edge(to, head[from]);
head[from]=size++;
} bool isedge(int u, int v){
u-=u%2; v-=v%2;
return u==v;
} int st, end, delEdge;
void dfs(int u, int fa){
vis[u]=true; for (int i=head[u]; i!=-1; i=edges[i].next)
if (edges[i].to!=fa){
int &to=edges[i].to;
if (!vis[to]) dfs(to, u);
else {
st=u; end=to;
delEdge=i;
// return; ?????
}
}
} bool flg=false;
long long dp(int u, int fa){
// printf("%d %d--\n", u, fa);
data[u][0]=0;
data[u][1]=val[u]; for (int i=head[u]; i!=-1; i=edges[i].next)
// if (!isedge(i, e) && !isedge(i, delEdge)){
if (!isedge(i, delEdge) && edges[i].to!=fa){
int &to=edges[i].to;
dp(to, u);
data[u][0]+=max(data[to][0], data[to][1]);
data[u][1]+=data[to][0];
}
return data[u][0];
} int main(void){
while (scanf("%d", &n)==1 && n){
init();
for (int i=1, ptr; i<=n; i++){
scanf("%lld%d", &val[i], &ptr);
addEdge(i, ptr);
addEdge(ptr, i);
} memset(vis, false, sizeof(vis));
long long ans=0;
for (int i=1; i<=n; i++) if (!vis[i]){
st=end=0;
dfs(i, -1);
// ans+=max(dp(st, -1), dp(end, -1));
if (st) ans+=max(dp(st, -1), dp(end, -1));
else ans+=max(dp(i, -1), data[i][1]);
}
printf("%lld\n", ans);
} return 0;
}
Time Memory Length Lang Submitted
2096ms 44900kB 1922 C++ 2018-08-14 07:07:29

HYSBZ-1040 骑士 基环树上的树状dp的更多相关文章

  1. HYSBZ 1040 骑士 (基环外向树DP)

    Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里,在和平环境中 ...

  2. 树上染色+可怜与超市(树状DP)

    这两道题是学长精心准备的,想了很长时间,比较经典. 第一题 树上染色 有一棵点数为 N的树,树边有边权.给你一个在 0∼N之内的正整数 K,你要在这棵树中选择 K 个点,将其染成黑色,并将其他的 N− ...

  3. poj3659树状DP

    Cell Phone Network Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6273   Accepted: 225 ...

  4. [Codeforces743D][luogu CF743D]Chloe and pleasant prizes[树状DP入门][毒瘤数据]

    这个题的数据真的很毒瘤,身为一个交了8遍的蒟蒻的呐喊(嘤嘤嘤) 个人认为作为一个树状DP的入门题十分合适,同时建议做完这个题之后再去做一下这个题 选课 同时在这里挂一个选取节点型树形DP的状态转移方程 ...

  5. 树状DP (poj 2342)

    题目:Anniversary party 题意:给出N各节点的快乐指数,以及父子关系,求最大快乐指数和(没人职员愿意跟直接上司一起玩): 思路:从底向上的树状DP: 第一种情况:第i个员工不参与,F[ ...

  6. hdu 1561 The more, The Better_树状dp

    题目链接 题意:给你一棵树,各个节点都有价值(除根节点),从根节点出发,选择m个节点,问最多的价值是多小. 思路:很明显是树状dp,遍历树时背包最优价值,dp[i][k]=max{dp[i][r]+d ...

  7. poj 2342 Anniversary party_经典树状dp

    题意:Ural大学有n个职员,1~N编号,他们有从属关系,就是说他们关系就像一棵树,父节点就是子节点的直接上司,每个职员有一个快乐指数,现在要开会,职员和职员的直接上司不能同时开会,问怎才能使开会的快 ...

  8. 树状DP HDU1520 Anniversary party

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 题意:职员之间有上下级关系,每个职员有自己的happy值,越高在派对上就越能炒热气氛.但是必须是 ...

  9. HDU 4714 Tree2cycle(树状DP)(2013 ACM/ICPC Asia Regional Online ―― Warmup)

    Description A tree with N nodes and N-1 edges is given. To connect or disconnect one edge, we need 1 ...

随机推荐

  1. ZBrush中如何使用套索工具绘制遮罩

    ZBrush®中创建遮罩的方法有很多,可以手动创建矩形遮罩.圆形遮罩和图案遮罩,然而这些遮罩都是固定的形状.使用Zbrush中的套索遮罩能够实现不规则的图形遮罩,游刃有余的发挥创作. 使用套索工具绘制 ...

  2. EntityFramework 二

    特性 用来具体的设置数据库属性   [Table("表名")]//设置表名 public class User { [Key] //设置主键 [Column("列名&qu ...

  3. C# 基础复习 二 面向对象

    继承:子承父业  子:子类    父:父类    业:所有非私有成员 好处:代码的复用   继承后,实例化子类时,不止子类的构造,父类的构造也会执行,而且父类的构造先于子类的构造执行 即使在子类可以看 ...

  4. jq——事件

    http://www.w3school.com.cn/jquery/jquery_ajax_intro.asp $(document),$(body) 加载事件: $(document).ready( ...

  5. 3D立体方块旋转图册

    代码可直接复制使用看效果 这个文章参考了Lazy.Cat的文章:https://www.cnblogs.com/Lazy-Cat/p/9750244.html,大家也可以去看看,他讲的还是比较详细的. ...

  6. python之静态属性、类方法、静态方法

    静态属性.类方法.静态方法 1. 静态属性:在函数前加@property,将函数逻辑”封装“成数据属性,外部直接调用函数名,如同调用属性一样.这个函数是可以调用类和实例的属性的,    静态属性的作用 ...

  7. 安装SSH、配置SSH无密码登录 ssh localhost

    集群.单节点模式都需要用到 SSH 登陆(类似于远程登陆,你可以登录某台 Linux 主机,并且在上面运行命令),Ubuntu 默认已安装了 SSH client,此外还需要安装 SSH server ...

  8. java实验程序基础中的问题总结 java图形化界面

    一,课程中的问题 1,知道程序实现的大体框架,但是不能具体到每一个细节,这需要平时的积累. 2,在不同文件夹中定义的类之间有没有联系,类与类之间可以通过接口相互联系. 3,如何在一个对话框中显示文本, ...

  9. Python 绘图与可视化 matplotlib 散点图、numpy模块的random()

    效果: 代码: def scatter_curve(): # plt.subplot(1,1,1) n=1024 X=np.random.normal(0,1,n) Y=np.random.norma ...

  10. static和extern的作用域--题目

    #include <stdio.h> ; int main(void) { , sum = , count = ; ,count++) // count = 2 { ; count++; ...