题目:牛客题目链接

思路:这道题有点像这道题

先缩点,缩完之后判断一下整个强连通分量入度是不是0,如果是的话向ans压入该强连通分量最小的那个值。最后排序一下ans输出就行了。

思路一下就想到了,就是写的有点迷,WA了好几发,加点注释...

炜神tql...果然我还是菜鸡,水题切的贼慢orz

代码:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cstdlib>
  4. #include<cctype>
  5. #include<queue>
  6. #include<cmath>
  7. #include<string>
  8. #include<map>
  9. #include<stack>
  10. #include<set>
  11. #include<vector>
  12. #include<iostream>
  13. #include<algorithm>
  14. #include<sstream>
  15. #define ll long long
  16. const int N=1e5+5;
  17. const ll INF=1e5+5;
  18. using namespace std;
  19. int n,m,cnt;
  20. map<int,int> vis;
  21. set<int> o;
  22. vector<int> g[N],check,ans,in[N];    //in记录的是指向i的点,在后面用来判断
  23. stack<int> s;
  24. int dfn[N],low[N];
  25. void tarjan(int x){
  26. dfn[x]=low[x]=++cnt;
  27. s.push(x);
  28. vis[x]=1;
  29. for(int i=0;i<g[x].size();i++){
  30. int v=g[x][i];
  31. if(!dfn[v]){
  32. tarjan(v);
  33. low[x]=min(low[x],low[v]);
  34. }
  35. else if(vis[v]){
  36. low[x]=min(low[x],dfn[v]);
  37. }
  38. }
  39. o.clear();    //用来查询scc的点
  40. if(dfn[x]==low[x]){
  41. int a;
  42. check.clear();
  43. while(true){
  44. a=s.top();
  45. s.pop();
  46. vis[a]=0;
  47. check.push_back(a); //记录这个强通量所有点
  48. o.insert(a); //记录这个强通量所有点,在后面用来查找
  49. if(a==x) break;
  50. }
  51. int flag=0;
  52. for(int i=0;i<check.size();i++){ //排查每个in
  53. int p=check[i];
  54. for(int j=0;j<in[p].size();j++){
  55. if(o.count(in[p][j])!=true){ //这个点不属于同一scc,说明整个scc有入度,不是我们要找的
  56. flag=1;
  57. break;
  58. }
  59. }
  60. if(flag) break;
  61. }
  62. if(flag==0){ //整个scc入度为0
  63. sort(check.begin(),check.end());
  64. ans.push_back(check[0]);    //只需要最小的那个就行了
  65. }
  66. }
  67. }
  68. void init(){
  69. cnt=0;
  70. ans.clear();
  71. vis.clear();
  72. memset(dfn,0,sizeof(dfn));
  73. memset(low,0,sizeof(low));
  74. while(s.size()!=0) s.pop();
  75. for(int i=0;i<N;i++){
  76. in[i].clear();
  77. g[i].clear();
  78. }
  79. }
  80. int main(){
  81. init();
  82. int u,v;
  83. scanf("%d%d",&n,&m);
  84. for(int k=0;k<m;k++){
  85. scanf("%d%d",&u,&v);
  86. g[u].push_back(v);
  87. in[v].push_back(u);
  88. }
  89. for(int i=1;i<=n;i++){
  90. if(!dfn[i]) tarjan(i);
  91. }
  92. sort(ans.begin(),ans.end());
  93. cout<<ans.size()<<endl;
  94. for(int i=0;i<ans.size();i++){
  95. if(i!=0) printf(" ");
  96. cout<<ans[i];
  97. }
  98. return 0;
  99. }

Wannafly14挑战赛 C(tarjan缩点)题解的更多相关文章

  1. 洛谷 P2194 HXY烧情侣【Tarjan缩点】 分析+题解代码

    洛谷 P2194 HXY烧情侣[Tarjan缩点] 分析+题解代码 题目描述: 众所周知,HXY已经加入了FFF团.现在她要开始喜(sang)闻(xin)乐(bing)见(kuang)地烧情侣了.这里 ...

  2. POJ 2553 The Bottom of a Graph Tarjan找环缩点(题解解释输入)

    Description We will use the following (standard) definitions from graph theory. Let V be a nonempty ...

  3. 缩点Tarjan算法解析+[题解]受欢迎的牛

    (注:我在网上找了一些图,希望原博主不要在意,谢谢,(。☉౪ ⊙。)) 首先来了解什么是强连通分量 有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向 ...

  4. P3387 【模板】缩点 题解 (Tarjan)

    题目链接 P3387 [模板]缩点 解题思路 这几天搞图论,好有趣hhh,多写几篇博客. 上次学\(Tarjan\)求割点,这次缩点. 思路大概是多一个栈和染色的步骤,每次\(Tarjan\)的时候把 ...

  5. POJ 1236 Network of Schools(强连通 Tarjan+缩点)

    POJ 1236 Network of Schools(强连通 Tarjan+缩点) ACM 题目地址:POJ 1236 题意:  给定一张有向图,问最少选择几个点能遍历全图,以及最少加入�几条边使得 ...

  6. 【Tarjan缩点】POJ2186 Popular Cows

    Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 35644   Accepted: 14532 De ...

  7. 【Tarjan缩点】PO3352 Road Construction

    Road Construction Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 12532   Accepted: 630 ...

  8. 【HDOJ2767】【Tarjan缩点】

    http://acm.hdu.edu.cn/showproblem.php?pid=2767 Proving Equivalences Time Limit: 4000/2000 MS (Java/O ...

  9. [HAOI2006]受欢迎的牛 tarjan缩点 + 拓扑排序

    ---题面--- 题解: 首先tarjan缩点应该还是容易想到的,因为喜爱具有传递性,所以一个强联通分量里面的点实际上是全部等效的,所以我们可以缩成一个方便判断, 缩完点之后整张图就变成了一个有向无环 ...

  10. POJ1236:Network of Schools (思维+Tarjan缩点)

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24880   Accepted: 99 ...

随机推荐

  1. python-面向对象-09_类属性和类方法

    类属性和类方法 目标 类的结构 类属性和实例属性 类方法和静态方法 01. 类的结构 1.1 术语 —— 实例 使用面相对象开发,第 1 步 是设计 类 使用 类名() 创建对象,创建对象 的动作有两 ...

  2. mysql 数据库的操作

    1.数据库的查看 1)查看mysql中所有的数据库    "show databases;" mysql> show databases; +---------------- ...

  3. mysql 数据类型 目录

    mysql 数据类型 mysql 整数类型 数值类型 tinyint mysql int 整数类型 解释显示宽度 和 存储宽度 mysql float 浮点型 mysql 日期类型 mysql 字符串 ...

  4. MySql操作语句集锦

    Windows服务 -- 启动MySQL    net start mysql-- 创建Windows服务    sc create mysql binPath= mysqld_bin_path(注意 ...

  5. (转)Springboot 中filter 注入对象

    问题:我建立一个全局拦截器,当然,这是测试的时候建立的,我把它命名为LogFilter,它继承了Filter,web应用启动的顺序是:listener->filter->servlet,而 ...

  6. WebService之Axis2 (3):使用services.xml文件发布WebService

    用Axis2实现Web Service,虽然可以将POJO类放在axis2\WEB-INF\pojo目录中直接发布成Web Service,这样做不需要进行任何配置,但这些POJO类不能在任何包中.这 ...

  7. php分层

    表示层         UI      主要表示WEB方式,也可以表示成WINFORM方式.如果逻辑层相当强大和完善,无论表现层如何定义和更改,逻辑层都能完善地提供服务. 业务逻辑层  BLL     ...

  8. UVALive - 7261 Xiongnu's Land

    思路: 先二分下界,再二分上届. #include <bits/stdc++.h> using namespace std; #define MP make_pair #define PB ...

  9. Codeforces Round #246 (Div. 2) D E

    这题说的是给了一个字符串当前缀和后缀相同的时候就计算此时的 整个串种拥有这样的子串友多少个,没想到用KMP解 用0开头的那种类型的 KMP 今天刚好也学了一下,因为KMP的作用是找出最长前缀 KMP ...

  10. [WPF]WPF开发方法论

    纵观Windows GUI应用程序开发方法,从Windows API.MFC到Visual Basic再到.NET Framework,WPF的开发方法论是在.NET Framework方法论的基础上 ...