有些题还得练练模拟的能力呀

这题一言难尽,他给的 图不是半连通子图呀,我崩溃了

要分好组,然后1给2连,2给3连,。。。。。n给1连。。

具体看代码,我写的比较捞了吧。。

  1. #include<iostream>
  2. #include<cstring>
  3. #include<vector>
  4. #include<algorithm>
  5. #include<stack>
  6. using namespace std;
  7. const int maxn = 2e5 + 7;
  8. vector<int>G[maxn], G2[maxn];
  9.  
  10. void insert(int be, int en) {
  11. G[be].push_back(en);
  12. }
  13. stack<int>s;
  14. int in[maxn];
  15. int out[maxn];
  16. int n;
  17. int dfn[maxn], low[maxn], clor[maxn], ins[maxn], ans, df;
  18.  
  19. int tarjan(int x) {
  20. s.push(x);
  21. dfn[x] = low[x] = ++df;
  22. for (int i = 0; i < G[x].size(); i++) {
  23. int p = G[x][i];
  24. if (!dfn[p]) {
  25. tarjan(p);
  26. low[x] = min(low[x], low[p]);
  27. }
  28. else if (!clor[p]) {
  29. low[x] = min(low[x], dfn[p]);
  30. }
  31. }
  32. if (dfn[x] == low[x]) {
  33. ans++;
  34. while (1) {
  35. int a = s.top();
  36. s.pop();
  37. clor[a] = ans;
  38. ins[ans] = a;
  39. if (a == x) break;
  40. }
  41. }
  42. return 0;
  43. }
  44. int find() {
  45. for (int i = 1; i <= n; i++) {
  46. if (!dfn[i]) {
  47. tarjan(i);
  48. }
  49. }
  50. for (int i = 1; i <= n; i++) {
  51. for (int j = 0; j < G[i].size(); j++) {
  52. int be = clor[i];
  53. int en = clor[G[i][j]];
  54. if (be != en) {
  55. in[en]++;
  56. out[be]++;//出
  57. G2[be].push_back(en);
  58. }
  59. }
  60. }
  61. for (int i = 1; i <= n; i++) {
  62. G[i].clear();
  63. }
  64. return 0;
  65. }
  66. int vis[maxn];
  67.  
  68. int dfs(int x) {
  69. for (int i = 0; i < G2[x].size(); i++) {
  70. int p = G2[x][i];
  71. dfs(p);
  72. vis[x] = vis[p];
  73. }
  74. return 0;
  75. }
  76. int list[maxn];
  77. vector<int>cns;
  78. int main() {
  79.  
  80. scanf("%d", &n);
  81. int x;
  82. int y;
  83. for (int i = 1; i <= n ; i++) {
  84. scanf("%d", &x);
  85. G[i].push_back(x);
  86.  
  87. }
  88. find();
  89. if (ans == 1) {
  90. printf("0\n");
  91. return 0;
  92. }
  93. n = ans;
  94. int c = 0;
  95. for (int i = 1; i <= n; i++) {
  96. if (out[i] == 0) {
  97. vis[i] = ++c;
  98. list[c] = i;
  99. }
  100. }
  101. for (int i = 1; i <= n; i++) {
  102. if (in[i] == 0) {
  103. dfs(i);
  104. }
  105. }
  106.  
  107. for (int i = 1; i <= n; i++) {
  108. if (in[i] == 0) {
  109. G[vis[i]].push_back(i);
  110. }
  111. }
  112. for (int i = 1; i < c; i++) {
  113. //list[i]--->G[i+1]
  114. for (int j = 0; j < G[i + 1].size(); j++) {
  115. cns.push_back(list[i]);
  116. cns.push_back(G[i + 1][j]);
  117. }
  118. }
  119. for (int i = 0; i < G[1].size(); i++) {
  120. cns.push_back(list[c]);
  121. cns.push_back(G[1][i]);
  122. }
  123. printf("%d\n", cns.size() / 2);
  124. for (int i = 0; i < cns.size(); i+=2) {
  125. printf("%d %d\n", ins[cns[i]], ins[cns[i + 1]]);
  126. }
  127. return 0;
  128. }

  

codefoces 22E 图论的更多相关文章

  1. Codeforces 22E(图论)

    题意: 给出n个节点,以及和这个节点指向的节点fi,表示从i能够到达fi,问至少需要添加多少条边能够使得原图变为强连通分量, 输出边数及添加的边,多解输出任意一组解. 2 <= n <= ...

  2. [leetcode] 题型整理之图论

    图论的常见题目有两类,一类是求两点间最短距离,另一类是拓扑排序,两种写起来都很烦. 求最短路径: 127. Word Ladder Given two words (beginWord and end ...

  3. 并查集(图论) LA 3644 X-Plosives

    题目传送门 题意:训练指南P191 分析:本题特殊,n个物品,n种元素则会爆炸,可以转移到图论里的n个点,连一条边表示u,v元素放在一起,如果不出现环,一定是n点,n-1条边,所以如果两个元素在同一个 ...

  4. NOIp 2014 #2 联合权值 Label:图论 !!!未AC

    题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离. ...

  5. HDU 5521 [图论][最短路][建图灵感]

    /* 思前想后 还是决定坚持写博客吧... 题意: n个点,m个集合.每个集合里边的点是联通的且任意两点之间有一条dis[i]的边(每个集合一个dis[i]) 求同时从第1个点和第n个点出发的两个人相 ...

  6. SDUT 2141 【TEST】数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历

    数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem ...

  7. [转] POJ图论入门

    最短路问题此类问题类型不多,变形较少 POJ 2449 Remmarguts' Date(中等)http://acm.pku.edu.cn/JudgeOnline/problem?id=2449题意: ...

  8. HDU 5934 Bomb 【图论缩点】(2016年中国大学生程序设计竞赛(杭州))

    Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  9. Codeforces 553C Love Triangles(图论)

    Solution: 比较好的图论的题. 要做这一题,首先要分析love关系和hate关系中,love关系具有传递性.更关键的一点,hate关系是不能成奇环的. 看到没有奇环很自然想到二分图的特性. 那 ...

随机推荐

  1. nodeJs学习-03 GET数据请求,js拆解/querystring/url

    原生JS解析参数: const http = require('http'); http.createServer(function(req,res){ var GET = {}; //接收数据容器 ...

  2. lattice planner 规划详解

    大家好,我是来自百度智能驾驶事业群的许珂诚.今天很高兴能给大家分享Apollo 3.0新发布的Lattice规划算法. Lattice算法隶属于规划模块.规划模块以预测模块.routing模块.高精地 ...

  3. js中setInterval与setTimeout用法 实现实时刷新每秒刷新

    setTimeout 定义和用法:  setTimeout()方法用于在指定的毫秒数后调用函数或计算表达式.     语法:  setTimeout(code,millisec)     参数:    ...

  4. Libev源码分析03:Libev使用堆管理定时器

    Libev中在管理定时器时,使用了堆这种结构,而且除了常见的最小2叉堆之外,它还实现了更高效的4叉堆. 之所以要实现4叉堆,是因为普通2叉堆的缓存效率较低,所谓缓存效率低,也就是说对CPU缓存的利用率 ...

  5. selenium webdriver学习(五)------------iframe的处理(转)

    selenium webdriver学习(五)------------iframe的处理 博客分类: Selenium-webdriver 如何定位frame中元素  有时候我们在定位一个页面元素的时 ...

  6. pytorch 优化器调参

    torch.optim 如何使用optimizer 构建 为每个参数单独设置选项 进行单次优化 optimizer.step() optimizer.step(closure) 算法 如何调整学习率 ...

  7. python中break和continue的区别

    python中break和continue的区别   break和continue 1.break 意思为结束循环   例: i = 0 while i<10:     i+=1     if ...

  8. H3C 帧中继协议特点

  9. [转]Springboot和SpringMVC区别

    spring boot只是一个配置工具,整合工具,辅助工具. springmvc是框架,项目中实际运行的代码 Spring 框架就像一个家族,有众多衍生产品例如 boot.security.jpa等等 ...

  10. mysql 第三课 jdbc基础操作

    jdbc连接可以大致分为5步: 1.注册驱动 2.获取连接 3.编写语句 4.执行语句 5.关闭连接 其中可以设置参数等等. 1.我们先建一个项目目录: 其中com.etc.dao为数据访问对象 co ...