使用tarjan缩合点。

然后,dfs寻找最长的公路。

水体。

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<algorithm>
  4. #include<iostream>
  5. #include<vector>
  6. #include<map>
  7. #include<stack>
  8. using namespace std;
  9. #define maxn 110000
  10. vector<int>old[maxn];
  11. vector<int>vec[maxn];
  12. int dnf[maxn],low[maxn],instack[maxn];
  13. int times,nums;
  14. stack<int>st;
  15. int pan[maxn];
  16. int ru[maxn];
  17. int vis[maxn];
  18. int ans;
  19. int res[maxn];
  20. int val[maxn];
  21. void init(int n)
  22. {
  23. for(int i=0;i<=n+1;i++)
  24. {
  25. dnf[i]=low[i]=instack[i]
  26. =pan[i]=ru[i]=vis[i]=res[i]=val[i]=0;
  27. vec[i].clear();old[i].clear();
  28. }
  29. while(!st.empty())st.pop();
  30. times=nums=1;
  31. }
  32. void tarjan(int x)
  33. {
  34. dnf[x]=low[x]=times++;
  35. instack[x]=1;
  36. st.push(x);
  37. for(int i=0;i<old[x].size();i++)
  38. {
  39. int y=old[x][i];
  40. if(!dnf[y])
  41. {
  42. tarjan(y);
  43. low[x]=min(low[x],low[y]);
  44. }
  45. else if(instack[y])
  46. {
  47. low[x]=min(low[x],dnf[y]);
  48. }
  49. }
  50. if(low[x]==dnf[x])
  51. {
  52. int y=-1;
  53. while(x!=y)
  54. {
  55. y=st.top();
  56. st.pop();
  57. instack[y]=0;
  58. pan[y]=nums;
  59. val[nums]++;
  60. }
  61. nums++;
  62. }
  63. }
  64. void dfs(int x)
  65. {
  66. if(res[x])return;
  67. res[x]=val[x];
  68. for(int i=0;i<vec[x].size();i++)
  69. {
  70. int y=vec[x][i];
  71. dfs(y);
  72. res[x]=max(res[x],res[y]+val[x]);
  73. }
  74. }
  75. int main()
  76. {
  77. int n,m,x,y;
  78. while(~scanf("%d%d",&n,&m))
  79. {
  80. init(n);
  81. while(m--)
  82. {
  83. scanf("%d%d",&x,&y);
  84. old[x].push_back(y);
  85. }
  86. for(int i=1;i<=n;i++)
  87. if(!dnf[i])tarjan(i);
  88. for(int i=1;i<=n;i++)
  89. {
  90. for(int j=0;j<old[i].size();j++)
  91. {
  92. x=pan[i];
  93. y=pan[old[i][j]];
  94. if(x==y)continue;
  95. vec[x].push_back(y);
  96. ru[y]++;
  97. }
  98. }
  99. ans=-1;
  100. for(int i=1;i<nums;i++)
  101. {
  102. if(!ru[i])
  103. {
  104. dfs(i);
  105. ans=max(ans,res[i]);
  106. }
  107. }
  108. cout<<ans<<endl;
  109. }
  110. return 0;
  111. }

版权声明:本文博主原创文章。博客,未经同意不得转载。

zoj-3795-Grouping-tarjan确定最长的公路收缩的更多相关文章

  1. zoj 3795 Grouping tarjan缩点 + DGA上的最长路

    Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Submit Status Practic ...

  2. ZOJ 3795 Grouping(Tarjan收缩点+DAG)

    Suppose there are N people in ZJU, whose ages are unknown. We have some messages about them. The i-t ...

  3. Grouping ZOJ - 3795 (tarjan缩点求最长路)

    题目链接:https://cn.vjudge.net/problem/ZOJ-3795 题目大意:给你n个人,m个关系, 让你对这个n个人进行分组,要求:尽可能的分组最少,然后每个组里面的人都没有关系 ...

  4. ZOJ 3795 Grouping 求最长链序列露点拓扑

    意甲冠军:特定n积分.m向边条. 该点被划分成多个集合随机的每个集合,使得2问题的关键是无法访问(集合只能容纳一个点) 问至少需要被分成几个集合. 假设没有戒指,接着这个话题正在寻求产业链最长的一个有 ...

  5. ZOJ 3795 Grouping (强连通缩点+DP最长路)

    <题目链接> 题目大意: n个人,m条关系,每条关系a >= b,说明a,b之间是可比较的,如果还有b >= c,则说明b,c之间,a,c之间都是可以比较的.问至少需要多少个集 ...

  6. ZOJ 3795 Grouping(scc+最长路)

    Grouping Time Limit: 2 Seconds      Memory Limit: 65536 KB Suppose there are N people in ZJU, whose ...

  7. ZOJ 3795 Grouping 强连通分量-tarjan

    一开始我还天真的一遍DFS求出最长链以为就可以了 不过发现存在有向环,即强连通分量SCC,有向环里的每个点都是可比的,都要分别给个集合才行,最后应该把这些强连通分量缩成一个点,最后保证图里是 有向无环 ...

  8. ZOJ 3795 Grouping

    大致题意是给n个人和m组关系,每组关系都是两个人s和t,表示s年龄不小于t的年龄,然后让你把这n个人分组,使得任何一个组里面的任意两人都不能直接或间接的得出这两个人的年龄大小关系. 思路:根据给出的关 ...

  9. 2014 Super Training #8 G Grouping --Tarjan求强连通分量

    原题:ZOJ 3795 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3795 题目大意:给定一个有向图,要求把点分为k个集 ...

随机推荐

  1. Spring in action(Spring实战) 第四版中文翻译

    第一部分 Spring核心 Spring提供了非常多功能,可是全部这些功能的基础是是依赖注入(DI)和面向方面编程(AOP). 第一章 Springing into action 本章包含: Spri ...

  2. oracle看到用户的所有表名、表睐、字段名称、现场的目光、是空的、字段类型

    --oracle看到用户的所有表名.表睐.字段名称.现场的目光.是空的.字段类型 select distinct TABLE_COLUMN.*, TABLE_NALLABLE.DATA_TYPE, T ...

  3. Linux如何用QQ?Linux下QQ使用的几种方案

    在linux下如何使用QQ?在ubuntu11.10中如何使用QQ?或许有初涉linux的人这样问,我们可以看看ubuntusoft总结出来的几种在linux系统下用QQ的方法.前面的几种主要的方法都 ...

  4. 冒泡排序java

    先对冒泡排序做一个简单的解释,然后是代码的实现.解释出资<java的数据结构和算法>,大家可以看看. 排序类: package com.dxx.order; public class Bu ...

  5. redis入门(转)

    Redis介绍 Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串,链表.哈希.集合和有序集合5种.支持在服务器端计算集合 ...

  6. Codeforces Round #257 (Div. 2) D题:Jzzhu and Cities 删特殊边的最短路

    D. Jzzhu and Cities time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  7. HDU 1695 GCD 欧拉函数+容斥原理+质因数分解

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=1695 题意:在[a,b]中的x,在[c,d]中的y,求x与y的最大公约数为k的组合有多少.(a=1, a ...

  8. Ejb in action(两)——示例入门

    在前面的文章中,,我们推出Ejb相关概念.在此之前展开的阐述,我给大家Ejb示例.加深印象. 开发环境:eclipse 应用server:jboss 1.服务端程序 在Eclipse中创建一个Ejb项 ...

  9. 【Linux探索之旅】第二部分第二课:命令行,世界尽在掌握

    内容简介 1.第二部分第二课:命令行,世界尽在掌握 2.第二部分第三课预告:文件和目录,组织不会亏待你 命令行,世界尽在掌握 今天的标题是不是有点霸气侧漏呢? 读者:“小编,你为什么每次都要起这么非主 ...

  10. Java没有源代码的同步集合~

    存档~~~~ Synchronized,volatile,lock 锁定->[就绪队列,阻塞队列] 第一个是jvm等级达到. 与volatile所不同的是,后者不能从工作存储器写回到主存储器. ...