题目链接: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. Unity 指定区域随机实例化预制体Prefab 代码

    using UnityEngine; public class NewBehaviourScript : MonoBehaviour { public GameObject prefab; void ...

  2. CorelDRAW X6冰点价加推800套燃爆6月

    CorelDRAW是迄今最具创意的图形设计程序,并获得所有行业的公认的知名工具.在刚刚结束的CorelDRAW X6限量活动之后,CorelDRAW官方继续加推800套CorelDRAW X6满足用户 ...

  3. 使用ECharts制作图形时,如何设置指定图形颜色?

    使用ECharts制作图形时,图形颜色是默认的颜色,有时需求需要指定图形颜色,这就需要自己去设置. 在option下的series属性中设置itemStyle,如下所示: itemStyle: { n ...

  4. 如何降低死循环的 CPU 占用

    有的时候程序中需要使用死循环,比如消息监听就要用一个死循环,直到受到消息请求关闭才可能跳出循环. 一个 while(true){} 的循环中即便循环体是空的,也会占用几乎一整个 CPU 核心.为了降低 ...

  5. GitHub报错error: bad signature

    Git报错 bad signature 将文件提交到仓库时,抛出以下错误: 报错 Roc@DESKTOP-AF552U2 MINGW64 /e/note/Git (master) $ git add ...

  6. 安装laravel项目出错

    我的本地是7.0.1,而下载下来的原来是运行在7.0.8版本的,于是执行:composer install 时,报了一堆错.解决办法:删掉composer.lock,重新composer instal ...

  7. vue 阿里云上传组件

    vue 阿里云上传组件 Vue.js上传图片到阿里云OSS存储 测试项目git地址 本测试项目启动方法 示例链接 组件配置项 实践解释 本文主要介绍如何 在vue项目中使用web 直传方式上传阿里云o ...

  8. 在join中,on和where的区别

    两个表在,join时,首先做一个笛卡尔积,on后面的条件是对这个笛卡尔积做一个过滤形成一张临时表,如果没有where就直接返回结果,如果有where就对上一步的临时表再进行过滤. 在使用left  j ...

  9. ASP.NET-Active Direcotry编程示例

    查找指定的AD帐号 using (DirectoryEntry de = new DirectoryEntry("LDAP://RootDSE")) { string DCName ...

  10. 单片机: EEPROM和串口通信

    名称:IIC协议 EEPROM24c02 通过串口通信存数读取数据 内容:此程序用于检測EEPROM性能,測试方法例如以下:写入24c02一个数据,然后在内存中改变这些数据. 掉电后主内存将失去这些信 ...