滚回第一页去了。。。

好吧,看了题解蒟蒻也写不粗来,怎么办捏?

看这个吧:Orz YDC巨巨;但是巨巨写的程序又不优美,于是程序Orz hzwer

其实这题的重点在于tarjan和单调队列dp里"f的更新"和"ans的更新"的先后顺序。。。

蒟蒻我研究半天才略懂还写不出题解,真是弱到不行了我去 ≥v≤ ~~~

  1 /**************************************************************
  2     Problem: 1023
  3     User: rausen
  4     Language: C++
  5     Result: Accepted
  6     Time:176 ms
  7     Memory:161276 kb
  8 ****************************************************************/
  9
 10 #include <cstdio>
 11 #include <algorithm>
 12
 13 using namespace std;
 14 const int N = 50005;
 15 const int M = 20000005;
 16
 17 struct edges{
 18     int next, to;
 19 }e[M];
 20 int first[N], dep[N], f[N];
 21 int dfn[N], low[N], fa[N];
 22 int a[N * 2], q[N * 2], l, r;
 23 int n, m, tot, cnt, ans;
 24
 25 inline int read(){
 26     int x = 0;
 27     char ch = getchar();
 28     while (ch < '0' || ch > '9')
 29         ch = getchar();
 30
 31     while (ch >= '0' && ch <= '9'){
 32         x = x * 10 + ch - '0';
 33         ch = getchar();
 34     }
 35     return x;
 36 }
 37
 38 inline void add_edge(int X, int Y){
 39     e[++tot].next = first[X];
 40     first[X] = tot;
 41     e[tot].to = Y;
 42 }
 43
 44 void add_Edges(int x, int y){
 45     add_edge(x, y);
 46     add_edge(y, x);
 47 }
 48
 49 void DP(int root, int p){
 50     int T = dep[p] - dep[root] + 1;
 51     for (int i = p; i != root; i = fa[i])
 52         a[T--] = f[i];
 53     a[T] = f[root];
 54     T = dep[p] - dep[root] + 1;
 55     for (int i = 1; i <= T; ++i)
 56         a[i + T] = a[i];
 57     q[1] = l = r = 1;
 58     for (int i = 2; i <= 2 * T; ++i){
 59         while (l <= r && i - q[l] > T / 2) ++l;
 60         ans = max(ans, a[i] + a[q[l]] + i - q[l]);
 61         while (l <= r && a[q[r]] - q[r] <= a[i] - i) --r;
 62         q[++r] = i;
 63     }
 64     for (int i = 2; i <= T; ++i)
 65         f[root] = max(f[root], a[i] + min(i - 1, T - i + 1));
 66 }
 67
 68 void dfs(int p){
 69     low[p] = dfn[p] = ++cnt;
 70     int x, y;
 71     for (x = first[p]; x; x = e[x].next)
 72         if ((y = e[x].to) != fa[p]){
 73             if (!dfn[y]){
 74                 fa[y] = p, dep[y] = dep[p] + 1;
 75                 dfs(y);
 76                 low[p] = min(low[p], low[y]);
 77             }else low[p] = min(low[p], dfn[y]);
 78             if (dfn[p] < low[y]){
 79                 ans = max(ans, f[p] + f[y] + 1);
 80                 f[p] = max(f[p], f[y] + 1);
 81             }
 82         }
 83     for (x = first[p]; x; x = e[x].next)
 84         if (fa[(y = e[x].to)] != p && dfn[p] < dfn[y])
 85             DP(p, y);
 86 }
 87
 88 int main(){
 89     n = read(), m = read();
 90     int k, X, Y, i, j;
 91     for (i = 1; i <= m; ++i){
 92         k = read(), X = read();
 93         for (j = 2; j <= k; ++j){
 94             Y = read();
 95             add_Edges(X, Y);
 96             X = Y;
 97         }
 98     }
 99     dfs(1);
100     printf("%d\n", ans);
101     return 0;
102 }

View Code

转载于:https://www.cnblogs.com/rausen/p/4044269.html

BZOJ1023 [SHOI2008]cactus仙人掌图相关推荐

  1. BZOJ1023[SHOI2008]cactus仙人掌图 【仙人掌DP】

    题目 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌 图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的回路. 举例来说 ...

  2. [bzoj1023][SHOI2008]cactus仙人掌图【仙人掌】

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1023 [题解] 仙人掌入门题,拿圆方树练练手. 圆方树就是把一个环建一个新方点,然后向 ...

  3. 2018.10.29 bzoj1023: [SHOI2008]cactus仙人掌图(仙人掌+单调队列优化dp)

    传送门 求仙人掌的直径. 感觉不是很难. 分点在环上面和不在环上分类讨论. 不在环上直接树形dpdpdp. 然后如果在环上讨论一波. 首先对环的祖先有贡献的只有环上dfsdfsdfs序最小的点. 对答 ...

  4. bzoj 1023: [SHOI2008]cactus仙人掌图(仙人掌求直径)

    1023: [SHOI2008]cactus仙人掌图 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 3668  Solved: 1535 [Submi ...

  5. BZOJ 1023: [SHOI2008]cactus仙人掌图

    1023: [SHOI2008]cactus仙人掌图 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 2907  Solved: 1212 [Submi ...

  6. [BZOJ]1023: [SHOI2008]cactus仙人掌图

    Time Limit: 1 Sec  Memory Limit: 162 MB Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这 ...

  7. [SHOI2008]cactus仙人掌图

    Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的 ...

  8. 【刷题】BZOJ 1023 [SHOI2008]cactus仙人掌图

    Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的 ...

  9. BZOJ.1023.[SHOI2008]cactus仙人掌图(DP)

    题目链接 类似求树的直径,可以用(类似)树形DP求每个点其子树(在仙人掌上就是诱导子图)最长链.次长链,用每个点子节点不同子树的 max{最长链}+max{次长链} 更新答案.(不需要存次长链,求解过 ...

最新文章

  1. 神经网络的分类准确率是100%到底意味着什么?
  2. pt1000温度对照表_温度传感器的常用检测方法
  3. 乐鑫官宣:ESP32-S3真的来了!
  4. pyqt5讲解10:布局管理讲解大全
  5. bzoj3884 上帝与集合的正确用法
  6. e4a html文本,E4A 怎么将剪贴版中的文本 粘贴到窗口的光标处啊?求个代码
  7. A轮股权学院:激活股权的力量,弄懂这些就够了
  8. 搭建数字图像处理开发环境(Python+pycharm+opencv)
  9. docker容器打包成镜像
  10. 1580. Dean's Debts
  11. html网站a标签直接下载pdf,不在浏览器打开
  12. linux ubuntu 版本,ubuntu各版本的区别
  13. 爬虫项目七:Python对唯品会商品数据、评论数据的爬取
  14. bzoj3894 文理分科 最小割
  15. 使用PHP从Access数据库中提取对象,第2部分
  16. Hive 的insert into 和 insert overwrite
  17. 队友代码拜读(文末附福利呦)
  18. Shit Happens
  19. 单级与多级放大器比较
  20. 多目标跟踪算法简述——量测-航机关联

热门文章

  1. 【三】版本之间穿梭切换
  2. 手把手带你入门Python爬虫(五、CSDN论坛之模型设计)
  3. Session过期,如何跳出iframe框架页的问题
  4. 如何查看服务器gpu性能,ubuntu服务器查看GPU和CPU实时使用情况
  5. 11相机不流畅_小米11有望本月发布,小米10退位让贤,256GB版本跌至3799
  6. angular js创建表单_如何优雅的使用 Angular 表单验证
  7. cmd怎么进入linux系统时间,Linux怎么更改命令提示符信息
  8. 二叉树经典题之二叉树最近公共祖先(LeetCode)
  9. python3.5 安装PyCrypto
  10. 软件测试要经过哪几个阶段?