Codeforces Beta Round #22 (Div. 2 Only) E. Scheme(DFS+强连通)
题目大意
给了 n(2<=n<=105) 个点,从每个点 u 出发连向了一个点 v(共 n 条边)
现在要求添加最少的边使得整个图是一个强连通图
做法分析
这道题千万不要一般化:先求强连通分量再把图化为 DAG 来做(我们能够很方便的得到需要添加的边的数量,但是加哪些边会变得很麻烦)
注意一个细节:每个点的出度必为 1
有什么特点?
从一个点 u 出发 DFS 遍历所有能够遍历到的点,DFS 结束的时候必定得到一个环!而且,因为每个点的出度为 1,所有遍历到的点只能形成一个环!而且这个环还是在路径的结尾,如果把这个换缩成一个点,那么我们等够得到的是一个“倒着长”的树(只存在从叶子节点到树根的节点,这个环缩成树根了)
如下面的图:
我们把所有的点作为起点 DFS 一遍之后就会得到一系列的这种图,当然,还有一种特殊情况:环!为了便于讲述,我们把它们叫做“分块”
给每个定义一个起点和终点,然后按照下面的做就行了:
当整个图只有一个环的时候,不可能通过加边使得其成为强连通图!
链接相邻的两个分块(分块 A 的终点连向分块 B 的起点)
对于分块中不是起点的入度为 0 的点,建一条反向边
好了,这样加边之后,整个图就以最小的加边数量变成强连通图了
参考代码
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+强连通)相关推荐
- 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 ...
- 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]之间包含了多少个数 ...
- 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 ...
- 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 ...
- Codeforces Beta Round #14 (Div. 2) B. Young Photographer 水题
B. Young Photographer 题目连接: http://codeforces.com/contest/14/problem/B Description Among other thing ...
- 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 ...
- 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 ...
- Codeforces Beta Round #16 (Div. 2 Only)【未完结】
2022.3.9 题目地址:https://codeforces.com/contest/16 目录 A. Flag[模拟] B. Burglar and Matches[贪心] C. Monitor ...
- Codeforces Beta Round #14 (Div. 2)【未完结】
2022.3.8 题单地址:https://codeforces.com/contest/14 目录 A. Letter B. Young Photographer[差分] C. Four Segme ...
最新文章
- Cloudera Manager是什么?
- mysql mac 中文乱码_Mac mysql 解决中文乱码
- java 异步阻塞_大白话搞懂什么是同步/异步/阻塞/非阻塞
- Java并发编程之ConcurrentHashMap原理解析
- python--for循环
- php 监听条码枪输入,一起看看js获取扫码枪输入数据的方法
- 2015-FCN论文解读
- 想批量转换音频?来试试这几个会议录音转文字软件
- 在ubuntu9.04中安装电视卡用到的资料
- 本地微信公众号授权登录获取code步骤
- echarts(雷达图和中国地图)
- 易语言服务器客户端网络验证,超强网络验证系统附远程服务支持库
- 内存占用过高,缓存不释放导致死机处理方案
- C语言:0, '0', '\0', NULL 区别
- 图像增强算法(持续更新中)
- 东社村计算机学校,苍南县义务教育阶段部分学校施教区范围
- 个人小程序申请制作流程
- 【MySQL数据库设计与应用(一)】数据库基础知识
- v-if/else branches must use unique keys.vue(29)
- Github的使用(二)
热门文章
- 用 Python 爬取了《雪中悍刀行》数据,终于知道它为什么这么火了
- 相信阿里只会PPT的“假专家”,随意做数字化转型,活该失败
- 知乎高赞!python能做这么多自动化,可开发效率真的有Java高?
- 阿里数据总监手把手教学:如何面向企业做一次有价值的数据分析
- php array walk 效率,php代码优化系列(二) -- array_walk 和 foreach, for 的效率的比较...
- python封装:隐藏对象中的属性或方法(三分钟读懂)
- python3应用程序代码_python3+PyQt5图形项的自定义和交互 python3实现page Designer应用程序...
- au插件vst_Propellerhead改名Reason Studios,并推出插件版Reason 11
- Java 1.1.6 码点与码点单元(回)
- 《南溪的目标检测学习笔记》——neck组件的设计笔记