最初想成了缩点了,感觉一个强连通分量只能选出一个人,gg...

正解基环树dp,把环断开后强制两个断点分别不选进行dp即可。

今天电脑抽风,老吞代码..

#include<iostream>
#include<cstring>
#include<cstdio>
#define int long long
using namespace std;inline int rd() {int ret=0,f=1;char c;while(c=getchar(),!isdigit(c))f=c=='-'?-1:1;while(isdigit(c))ret=ret*10+c-'0',c=getchar();return ret*f;
}const int MAXN=1000050;int val[MAXN],wei[MAXN];struct Edge {int from,next,to;Edge(int x=0,int y=0,int w=0) {from=x;next=y;to=w;}
} e[MAXN<<1];
int ecnt=1,head[MAXN];
inline void add(int x,int y){e[++ecnt]=Edge(x,head[x],y);head[x]=ecnt;
}bool vis[MAXN];int n;
int f[MAXN][2];
int cx,cy,ci;
void dfs(int x,int pre){f[x][1]=val[x];f[x][0]=0;for(int i=head[x];i;i=e[i].next){int v=e[i].to;if(v==pre||i==ci||(i==(ci^1))) continue;dfs(v,x);f[x][1]+=f[v][0];f[x][0]+=max(f[v][0],f[v][1]);}
}void findCircle(int x,int pre){vis[x]=1;for(int i=head[x];i;i=e[i].next){int v=e[i].to;if(v==pre) continue;if(vis[v]) {cx=x,cy=v,ci=i;continue;}findCircle(v,x);}
}int ans;signed main(){n=rd();int x,y,w;for(int i=1;i<=n;i++){val[i]=rd();x=rd();add(x,i);add(i,x);}int ans1=0,ans2=0;for(int i=1;i<=n;i++){if(vis[i]) continue;findCircle(i,0);dfs(cx,0);ans1=f[cx][0];dfs(cy,0);ans2=f[cy][0];ans+=max(ans1,ans2);}cout<<ans;
}

转载于:https://www.cnblogs.com/ghostcai/p/9400411.html

[BZOJ] 1040: [ZJOI2008]骑士相关推荐

  1. bzoj 1040: [ZJOI2008]骑士 树形dp

    题目链接 1040: [ZJOI2008]骑士 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 3054  Solved: 1162 [Submit] ...

  2. 基环树DP(bzoj 1040: [ZJOI2008]骑士)

    树:n个点n-1条边的连通图 基环树:n个点n条边的连通图,也就是一个环套着多棵树 基环树DP:找到环上任意相邻两点,断掉这两点之间的边,就形成了一棵树 之后对这两点分别进行一次树形DP即可 例题: ...

  3. bzoj 1040: [ZJOI2008]骑士

    第一次做环套树的题 这道题题目中貌似是有向边,实际上想一想就知道是无向的. 因为一个骑士觉得另一个骑士丑他们俩就走不到一起. 所以整个图实际上是一个无向环套树森林. 对于每一棵环套树,先dfs找环,找 ...

  4. BZOJ 1040 ZJOI2008 骑士 树形DP

    题目大意:给定一个基环树林,每一个点上有权值,要求选择一个权值和最大的点集,要求点集中的随意两个点之间不能直接相连 最大点独立集--考虑到n<=100W,网络流铁定跑不了,于是我们考虑树形DP ...

  5. BZOJ 1040 [ZJOI2008]骑士

    内向树dp~ 就是先找环,任取环上有边相连两点,u和v,以u为根,断开u和v之间的边,做两次树形dp,dp[i][0]表示i不选,dp[i][1]表示i选 ①强制u不选,v随意 ②u随意,v不选 两种 ...

  6. bzoj 1040 1040: [ZJOI2008]骑士

    1040: [ZJOI2008]骑士 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 5210  Solved: 1987 [Submit][Stat ...

  7. 1040: [ZJOI2008]骑士

    Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 7113  Solved: 2797 [Submit][Status][Discuss] Descri ...

  8. BZOJ1040: [ZJOI2008]骑士

    1040: [ZJOI2008]骑士 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 5332  Solved: 2023 [Submit][Stat ...

  9. P2607 [ZJOI2008]骑士

    P2607 [ZJOI2008]骑士 题意: n个点n个边,每个点都有权值,相邻的点不能同时选择,问如何选择能使得权值最大 题解: 这个题很有P1352 没有上司的舞会这个题的感觉,唯一的区别是那个题 ...

  10. bzoj 1038 [ZJOI2008]瞭望塔

    1038: [ZJOI2008]瞭望塔 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2438  Solved: 1004 [Submit][Sta ...

最新文章

  1. 泼点冷水,P2P借款限额是不是想的太美好?
  2. JAVA微信APP支付接口整合
  3. mysqlcppconn之ConnectOptionsMap的使用
  4. asp.net 调用带证书的webservice解决办法
  5. 3D数学基础:图形与游戏开发---随笔二
  6. PHP多线程的实现(PHP多线程类)
  7. C++中operator的两种用法
  8. jQuery中的函数汇总1
  9. linux下进程的创建代码,伪代码说明Linux进程创建过程
  10. 以rpm包形式升级Linux驱动
  11. 如何看Spring源码
  12. 智慧城市顶层设计规划方案
  13. QT QLabel中字体行间距怎么设置?
  14. 为你的企业建立竞争情报系统
  15. nodejs ffi调用C++dll动态库 ffi调用语法
  16. 每日一题:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
  17. python换脸开源_Python实现AI换脸功能
  18. es6 filter() 数组过滤方法总结
  19. 十年HRD总结3个逆向思维的招聘方法
  20. HINSTANCE初了解

热门文章

  1. SpringMVC接受JSON参数详解
  2. Vue开源项目库汇总-转
  3. [No0000DD]C# StringEx 扩展字符串类 类封装
  4. 文成小盆友python-num6 -反射 ,常用模块
  5. (原创)c#学习笔记03--变量和表达式03--变量04--变量的声明和赋值
  6. Java空字符串与null区别
  7. ActionScript3.0中获取变量类型的方法
  8. Python学习第五天
  9. OpenStack 企业私有云的若干需求(2):自动扩展(Auto-scaling) 支持
  10. fzu 2037 Maximum Value Problem