bzoj 1040: [ZJOI2008]骑士 環套樹DP
1040: [ZJOI2008]骑士
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 1755 Solved: 690
[Submit][Status]
Description
Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英。他们劫富济贫,惩恶扬善,受到社会各界的赞扬。最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争。战火绵延五百里,在和平环境中安逸了数百年的Z国又怎能抵挡的住Y国的军队。于是人们把所有的希望都寄托在了骑士团的身上,就像期待有一个真龙天子的降生,带领正义打败邪恶。骑士团是肯定具有打败邪恶势力的能力的,但是骑士们互相之间往往有一些矛盾。每个骑士都有且仅有一个自己最厌恶的骑士(当然不是他自己),他是绝对不会与自己最厌恶的人一同出征的。战火绵延,人民生灵涂炭,组织起一个骑士军团加入战斗刻不容缓!国王交给了你一个艰巨的任务,从所有的骑士中选出一个骑士军团,使得军团内没有矛盾的两人(不存在一个骑士与他最痛恨的人一同被选入骑士军团的情况),并且,使得这支骑士军团最具有战斗力。为了描述战斗力,我们将骑士按照1至N编号,给每名骑士一个战斗力的估计,一个军团的战斗力为所有骑士的战斗力总和。
Input
第一行包含一个正整数N,描述骑士团的人数。接下来N行,每行两个正整数,按顺序描述每一名骑士的战斗力和他最痛恨的骑士。
Output
应包含一行,包含一个整数,表示你所选出的骑士军团的战斗力。
Sample Input
10 2
20 3
30 1
Sample Output
HINT
对于100%的测试数据,满足N ≤ 1 000 000,每名骑士的战斗力都是不大于 1 000 000的正整数。
Source
╮(╯▽╰)╭ 網上說什麼外向樹內向樹,完全不懂,說白了,這道題就是一個環套樹DP,由於每個人只貢獻一條邊,所以最終圖的結構只會是一系列包含一個環的聯通快,在這些聯通塊上分別做環套樹DP就行了。
這道題環套樹DP非常簡單,直接隨機選環上一條邊刪掉,然後特殊處理刪掉邊的兩個端點,使之不被選擇,然後在樹上DP即可。
這是我第一次編環套樹。
- #include<iostream>
- #include<cstdio>
- #include<cstdlib>
- #include<cstring>
- #include<ctime>
- #include<cmath>
- #include<algorithm>
- #include<set>
- #include<map>
- #include<vector>
- #include<string>
- #include<queue>
- using namespace std;
- #ifdef WIN32
- #define LL "%I64d"
- #else
- #define LL "%lld"
- #endif
- #define MAXN 1100000
- #define MAXV MAXN*2
- #define MAXE MAXV*2
- #define INF 0x3f3f3f3f
- #define INFL 0x00003f3f3f3f3f3fLL
- typedef long long qword;
- inline int nextInt()
- {
- char ch;
- int x=;
- bool flag=false;
- do
- ch=getchar(),flag=(ch=='-')?true:flag;
- while(ch<''||ch>'');
- do x=x*+ch-'';
- while (ch=getchar(),ch<='' && ch>='');
- return x*(flag?-:);
- }
- int n,m;
- int e[MAXN][];
- struct Edge
- {
- int np;
- Edge *next;
- }E[MAXE],*V[MAXV];
- int tope=-;
- void addedge(int x,int y)
- {
- E[++tope].np=y;
- E[tope].next=V[x];
- V[x]=&E[tope];
- }
- int uf[MAXN];
- int get_fa(int now)
- {
- return (now==uf[now])?now:(uf[now]=get_fa(uf[now]));
- }
- bool comb(int x,int y)
- {
- x=get_fa(x);
- y=get_fa(y);
- if (x==y)return false;
- uf[x]=y;
- return true;
- }
- int roof[MAXN],topr=-;
- int state[MAXN];
- int ptr[MAXN];
- int v[MAXN];
- pair<qword,qword> dfs(int now,int f)
- {
- pair<qword,qword> ret,t;
- Edge *ne;
- ret=make_pair(v[now],);
- for (ne=V[now];ne;ne=ne->next)
- {
- if (ne->np==f)continue;
- t=dfs(ne->np,now);
- ret.second+=max(t.first,t.second);
- ret.first+=t.second;
- }
- if (state[now])ret.first=-INFL;
- return ret;
- }
- int main()
- { int i,j,k;
- int x,y,z;
- qword ans=;
- scanf("%d",&n);
- memset(ptr,-,sizeof(ptr));
- for (i=;i<=n;i++)uf[i]=i;
- for (i=;i<n;i++)
- {
- scanf("%d%d",&v[i+],&e[i][]);
- e[i][]=i+;
- if (!comb(e[i][],e[i][]))
- {
- roof[++topr]=e[i][];
- e[i][]=true;
- ptr[e[i][]]=e[i][];
- }else
- {
- addedge(e[i][],e[i][]);
- addedge(e[i][],e[i][]);
- }
- }
- for (i=;i<=topr;i++)
- {
- state[get_fa(roof[i])]=true;
- }
- for (i=;i<=n;i++)
- {
- if (!state[get_fa(i)])
- {
- state[get_fa(i)]=true;
- roof[++topr]=get_fa(i);
- }
- }
- memset(state,,sizeof(state));
- pair<qword,qword> pr;
- qword t;
- for (i=;i<=topr;i++)
- {
- if (ptr[roof[i]]==-)
- {
- pr=dfs(roof[i],roof[i]);
- ans+=max(pr.first,pr.second);
- }else
- {
- //state[roof[i]]=true;
- state[ptr[roof[i]]]=true;
- pr=dfs(roof[i],roof[i]);
- t=max(pr.first,pr.second);
- state[ptr[roof[i]]]=false;
- pr=dfs(roof[i],roof[j]);
- t=max(t,pr.second);
- ans+=t;
- }
- }
- printf(LL"\n",ans);
- return ;
- }
bzoj 1040: [ZJOI2008]骑士 環套樹DP的更多相关文章
- BZOJ 1040: [ZJOI2008]骑士(基环树dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=1040 题意: 思路: 这是基环树,因为每个人只会有一个厌恶的人,所以每个节点只会有一个父亲节点,但是 ...
- BZOJ 1040 [ZJOI2008]骑士 (基环树+树形DP)
<题目链接> 题目大意: Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的 ...
- bzoj 1040: [ZJOI2008]骑士 树形dp
题目链接 1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3054 Solved: 1162[Submit][S ...
- BZOJ 1040: [ZJOI2008]骑士 基环加外向树
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1190 Solved: 465[Submit][Status] ...
- [BZOJ 1040][ZJOI2008]骑士
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5403 Solved: 2060[Submit][Status ...
- Bzoj 1040 [ZJOI2008]骑士 题解
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5368 Solved: 2044[Submit][Status ...
- [BZOJ 1040] [ZJOI2008] 骑士 【基环+外向树DP】
题目链接:BZOJ - 1040 题目分析 这道题目的模型就是一个图,不一定联通,每个连通块的点数等于边数. 每个连通块都是一个基环+外向树.即树上增加了一条边. 如果是树,就可以直接树形DP了.然而 ...
- 【BZOJ】1040: [ZJOI2008]骑士(环套树dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=1040 简直不能再神的题orz. 蒟蒻即使蒟蒻,完全不会. 一开始看到数据n<=1000000就 ...
- bzoj 1040 [ZJOI2008]骑士(基环外向树,树形DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1040 [题意] 给一个基环森林,每个点有一个权值,求一个点集使得点集中的点无边相连且权 ...
随机推荐
- windows 下一个 easy_install 设备
下载安装python安装工具 1,方法是下载ez_setup.py后 2,在cmd下运行 python ez_setup.py.就可以自己主动安装setuptools 3,环境变量设置将 C:\Pro ...
- Myapplication的作用与理解
1.前沿在设置里面,对应于某一个应用,虽然没有启动,但是上面有一个终止按钮,说明这个应用时启动的,只是里面没有Activity,所以说使用android退出把一个应用退出,实际上他所对应的Applic ...
- ctkPlugin插件系统实现项目插件式开发
插件式开发体会: 自开始写[大话QT]系列就开始接触渲染客户端的开发,说是开发不如更多的说是维护以及重构,在接手这块的东西之前自己还有点犹豫,因为之前我一直认为客户端嘛,没什么技术含量,总是想做比较有 ...
- 基于keepalived对redis做高可用配置---转载
关于keepalived的详细介绍,请移步本人相关博客:http://wangfeng7399.blog.51cto.com/3518031/1405785 功能 ip地址 安装软件 主redis 1 ...
- 5 Ways to Use Log Data to Analyze System Performance--reference
Recently we looked across some of the most common behaviors that our community of 25,000 users looke ...
- oracle在敏感操作前创建还原点
我们都知道,在vmware虚拟机中有一个拍摄快照的功能,我们可以把系统此时的状态保存下来,一方后面遇到不测事件,也好将系统还原,oracle中也有类似功能. 首先创建一张学生表: 向学生表中插入一条数 ...
- sqlite 获取数据库中的所有表
SELECT name from sqlite_master where type='table'
- 配置toad进行导入导出数据库操作
最近需要对oracle进行导入导出操作,于是研究使用toad进行导入导出oracle数据库操作,现稍作记录. oracle的导入导出不管是否使用toad还是pl/sql工具进行操作,实际上最终都是通过 ...
- CEO、COO、CFO、CTO
CEO.COO.CFO.CTO是什么意思? 网站里的各种职位: CEO(Chief executive officer)首席执行官 类似总经理.总裁,是企业的法人代表. COO(Chief opera ...
- JQM 页面滚动加载
1 应用场景:文章比较长,只加载部分,当到页面底部触发获取更多数据. 2 如图,监听滚动条的位置,触发事件,转化为求X的长度, 3 实例代码: //滚动条到底加载更多 $(document).on(& ...