1040: [ZJOI2008]骑士

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 5210  Solved: 1987
[Submit][Status][Discuss]

Description

  Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英。他们劫富济贫,惩恶扬善,受到社会各
界的赞扬。最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争。战火绵延五百里,在和平环境
中安逸了数百年的Z国又怎能抵挡的住Y国的军队。于是人们把所有的希望都寄托在了骑士团的身上,就像期待有一
个真龙天子的降生,带领正义打败邪恶。骑士团是肯定具有打败邪恶势力的能力的,但是骑士们互相之间往往有一
些矛盾。每个骑士都有且仅有一个自己最厌恶的骑士(当然不是他自己),他是绝对不会与自己最厌恶的人一同出
征的。战火绵延,人民生灵涂炭,组织起一个骑士军团加入战斗刻不容缓!国王交给了你一个艰巨的任务,从所有
的骑士中选出一个骑士军团,使得军团内没有矛盾的两人(不存在一个骑士与他最痛恨的人一同被选入骑士军团的
情况),并且,使得这支骑士军团最具有战斗力。为了描述战斗力,我们将骑士按照1至N编号,给每名骑士一个战
斗力的估计,一个军团的战斗力为所有骑士的战斗力总和。

Input

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

Output

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

Sample Input

3
10 2
20 3
30 1

Sample Output

30

HINT

N ≤ 1 000 000,每名骑士的战斗力都是不大于 1 000 000的正整数。

Source

题意:给出基环树林,求最大点权独立集。

思路:

对于每棵基环树,我们找到环上的一条边,设边上的两端点分别为u和v,f[i]为以i为根的子树在取i点的情况下的最大权值,g[i]为不取,于是我们有以下做法: 
1.断掉这条边 
2.u不取,v任意,我们以u为根跑一遍树形DP,取g[u] 
3.v不取,u任意,我们以v为根跑一遍树形DP,取g[v] 
4.取上述两个值中的最大值,记入ans

吐槽:考试的时候跑的网络流求最大点权独立集,然后跑最小割,求最小点权覆盖集,然后总的和值-最小点权覆盖集就是答案。然后全部WA了┭┮﹏┭┮,求大神找错QWQ后来才知道是建图建错了,而网络流会TLE。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 2000101
using namespace std;
int n,U,V,E,tot=;
long long ans,f[MAXN],g[MAXN];
int val[MAXN],vis[MAXN];
int to[MAXN*],net[MAXN*],head[MAXN*];
void add(int u,int v){
to[++tot]=v;net[tot]=head[u];head[u]=tot;
to[++tot]=u;net[tot]=head[v];head[v]=tot;
}
void dfs(int now,int fa){
vis[now]=;
for(int i=head[now];i;i=net[i])
if((i^)!=fa){
if(vis[to[i]]){
U=now;
V=to[i];
E=i;
continue;
}
dfs(to[i],i);
}
}
void dp(int now,int from,int dont){
f[now]=val[now];
g[now]=;
for(int i=head[now];i;i=net[i])
if((i^)!=from&&i!=dont&&(i^)!=dont){
dp(to[i],i,dont);
f[now]+=g[to[i]];
g[now]+=max(g[to[i]],f[to[i]]);
}
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
int x;
scanf("%d%d",&val[i],&x);
add(i,x);
}
for(int i=;i<=n;i++)
if(!vis[i]){
dfs(i,);
dp(U,,E);
long long bns=g[U];
dp(V,,E);
bns=max(bns,g[V]);
ans+=bns;
}
cout<<ans;
}

最新文章

  1. cookie的存储和获取
  2. Oracle EBS - Doc
  3. asp.net 文件批量移动重命名
  4. Spring 之autowired
  5. ADB server didn&#39;t ACK 解决方法
  6. BZOJ 1567: [JSOI2008]Blue Mary的战役地图( 二分答案 + hash )
  7. 如何查看.Net源代码vs版本号以及C#项目中各文件的含义
  8. Linux 该文件命令查看内容
  9. AFNetworking 关于JSON text did not start with array or object and option to allow fragments not set 错误
  10. 把项目放到码云上,通过git 进行项目管理
  11. 浏览器将URL变成一个屏幕上显示的网页的过程?
  12. SSH框架之hibernate《三》
  13. 查看oracle当前的连接数
  14. Python 之 __new__() 方法与实例化
  15. python3 迭代器
  16. E: Unable to locate package openjdk-8-jdk 及java version 切换
  17. 域PC脱域
  18. pageContext中page、request、session、application四种范围变量的用法。
  19. STM32f103的数电采集电路的TIMER定时器的使用与时序控制的程序
  20. pip或easy_install安装库报错:SSL: CERTIFICATE_VERIFY_FAILED

热门文章

  1. Linux下安装Solr7.5.0,并部署到Tomcat
  2. plsql 中出现 Dynamic Performance Tables not accessible 问题解决
  3. STM32 Cubemx 输出可调频率与占空比的PWM
  4. Firefox OS简单介绍
  5. 仿hibernate,spring框架手动写
  6. HDU 4828 (卡特兰数+逆元)
  7. zzulioj--1715--土豪银行(贪心)
  8. [JZOJ 4307] [NOIP2015模拟11.3晚] 喝喝喝 解题报告
  9. 计算label
  10. Swift学习笔记(10):类和结构体