题目大意

给了 n(2<=n<=105) 个点,从每个点 u 出发连向了一个点 v(共 n 条边)

现在要求添加最少的边使得整个图是一个强连通图

做法分析

这道题千万不要一般化:先求强连通分量再把图化为 DAG 来做(我们能够很方便的得到需要添加的边的数量,但是加哪些边会变得很麻烦)

注意一个细节:每个点的出度必为 1

有什么特点?

从一个点 u 出发 DFS 遍历所有能够遍历到的点,DFS 结束的时候必定得到一个环!而且,因为每个点的出度为 1,所有遍历到的点只能形成一个环!而且这个环还是在路径的结尾,如果把这个换缩成一个点,那么我们等够得到的是一个“倒着长”的树(只存在从叶子节点到树根的节点,这个环缩成树根了)

如下面的图:

我们把所有的点作为起点 DFS 一遍之后就会得到一系列的这种图,当然,还有一种特殊情况:环!为了便于讲述,我们把它们叫做“分块”

给每个定义一个起点和终点,然后按照下面的做就行了:

当整个图只有一个环的时候,不可能通过加边使得其成为强连通图!

链接相邻的两个分块(分块 A 的终点连向分块 B 的起点)

对于分块中不是起点的入度为 0 的点,建一条反向边

好了,这样加边之后,整个图就以最小的加边数量变成强连通图了

参考代码

E. Scheme

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4
 5 using namespace std;
 6
 7 const int N=100006;
 8 int n, arc[N], s[N], t[N], in[N], ind, End[N], ans;
 9 bool vs[N];
10
11 void DFS(int u)
12 {
13     vs[u]=1;
14     if(vs[arc[u]])
15     {
16         End[u]=u;
17         return;
18     }
19     DFS(arc[u]);
20     End[u]=End[arc[u]];
21 }
22
23 int main()
24 {
25     scanf("%d", &n);
26     for(int i=1; i<=n; i++)
27     {
28         scanf("%d", &arc[i]), vs[i]=0;
29         in[arc[i]]++;
30     }
31     ind=ans=0;
32     for(int i=1; i<=n; i++)
33     {
34         if(in[i]) continue;
35         ans++;
36         if(!vs[arc[i]])
37         {
38             s[ind]=i;
39             DFS(i);
40             t[ind++]=End[i];
41         }
42     }
43     int circle=0;
44     for(int i=1; i<=n; i++)
45         if(in[i] && !vs[i])
46         {
47             circle++;
48             s[ind]=i;
49             DFS(i);
50             t[ind++]=End[i];
51         }
52     if(circle==1 && ans==0)
53     {
54         printf("0\n");
55         return 0;
56     }
57     else ans+=circle;
58     printf("%d\n", ans);
59     for(int i=0; i<ind-1; i++) printf("%d %d\n", t[i], s[i+1]);
60     if(ans) printf("%d %d\n", t[ind-1], s[0]);
61     for(int i=1; i<=n; i++)
62     {
63         if(in[i] || vs[i]) continue;
64         printf("%d %d\n", arc[i], i);
65     }
66     return 0;
67 }

题目链接 & AC通道

Codeforces Beta Round #22 (Div. 2 Only) E. Scheme

转载于:https://www.cnblogs.com/zhj5chengfeng/archive/2013/04/21/3034588.html

Codeforces Beta Round #22 (Div. 2 Only) E. Scheme(DFS+强连通)相关推荐

  1. Codeforces Beta Round #4 (Div. 2 Only)

    Codeforces Beta Round #4 (Div. 2 Only) A 水题 1 #include<bits/stdc++.h> 2 using namespace std; 3 ...

  2. Codeforces Beta Round #75 (Div. 1 Only) B. Queue 线段树。单点更新

    http://codeforces.com/problemset/problem/91/B 题意: 给你n个数,求得i 到n中小于a[i]的最右边的a[j],然后求a[i]到a[j]之间包含了多少个数 ...

  3. Codeforces Beta Round #92 (Div. 1 Only) A. Prime Permutation 暴力

    A. Prime Permutation 题目连接: http://www.codeforces.com/contest/123/problem/A Description You are given ...

  4. Codeforces Beta Round #9 (Div. 2 Only) D. How many trees? dp

    D. How many trees? 题目连接: http://www.codeforces.com/contest/9/problem/D Description In one very old t ...

  5. Codeforces Beta Round #14 (Div. 2) B. Young Photographer 水题

    B. Young Photographer 题目连接: http://codeforces.com/contest/14/problem/B Description Among other thing ...

  6. Codeforces Beta Round #96 (Div. 1) D. Constants in the language of Shakespeare 贪心

    D. Constants in the language of Shakespeare Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codef ...

  7. Codeforces Beta Round #9 (Div. 2 Only) C. Hexadecimal's Numbers dfs

    C. Hexadecimal's Numbers 题目连接: http://www.codeforces.com/contest/9/problem/C Description One beautif ...

  8. Codeforces Beta Round #16 (Div. 2 Only)【未完结】

    2022.3.9 题目地址:https://codeforces.com/contest/16 目录 A. Flag[模拟] B. Burglar and Matches[贪心] C. Monitor ...

  9. Codeforces Beta Round #14 (Div. 2)【未完结】

    2022.3.8 题单地址:https://codeforces.com/contest/14 目录 A. Letter B. Young Photographer[差分] C. Four Segme ...

最新文章

  1. Cloudera Manager是什么?
  2. mysql mac 中文乱码_Mac mysql 解决中文乱码
  3. java 异步阻塞_大白话搞懂什么是同步/异步/阻塞/非阻塞
  4. Java并发编程之ConcurrentHashMap原理解析
  5. python--for循环
  6. php 监听条码枪输入,一起看看js获取扫码枪输入数据的方法
  7. 2015-FCN论文解读
  8. 想批量转换音频?来试试这几个会议录音转文字软件
  9. 在ubuntu9.04中安装电视卡用到的资料
  10. 本地微信公众号授权登录获取code步骤
  11. echarts(雷达图和中国地图)
  12. 易语言服务器客户端网络验证,超强网络验证系统附远程服务支持库
  13. 内存占用过高,缓存不释放导致死机处理方案
  14. C语言:0, '0', '\0', NULL 区别
  15. 图像增强算法(持续更新中)
  16. 东社村计算机学校,苍南县义务教育阶段部分学校施教区范围
  17. 个人小程序申请制作流程
  18. 【MySQL数据库设计与应用(一)】数据库基础知识
  19. v-if/else branches must use unique keys.vue(29)
  20. Github的使用(二)

热门文章

  1. 用 Python 爬取了《雪中悍刀行》数据,终于知道它为什么这么火了
  2. 相信阿里只会PPT的“假专家”,随意做数字化转型,活该失败
  3. 知乎高赞!python能做这么多自动化,可开发效率真的有Java高?
  4. 阿里数据总监手把手教学:如何面向企业做一次有价值的数据分析
  5. php array walk 效率,php代码优化系列(二) -- array_walk 和 foreach, for 的效率的比较...
  6. python封装:隐藏对象中的属性或方法(三分钟读懂)
  7. python3应用程序代码_python3+PyQt5图形项的自定义和交互 python3实现page Designer应用程序...
  8. au插件vst_Propellerhead改名Reason Studios,并推出插件版Reason 11
  9. Java 1.1.6 码点与码点单元(回)
  10. 《南溪的目标检测学习笔记》——neck组件的设计笔记