codefoces 22E 图论
有些题还得练练模拟的能力呀
这题一言难尽,他给的 图不是半连通子图呀,我崩溃了
要分好组,然后1给2连,2给3连,。。。。。n给1连。。
具体看代码,我写的比较捞了吧。。
- #include<iostream>
- #include<cstring>
- #include<vector>
- #include<algorithm>
- #include<stack>
- using namespace std;
- const int maxn = 2e5 + 7;
- vector<int>G[maxn], G2[maxn];
- void insert(int be, int en) {
- G[be].push_back(en);
- }
- stack<int>s;
- int in[maxn];
- int out[maxn];
- int n;
- int dfn[maxn], low[maxn], clor[maxn], ins[maxn], ans, df;
- int tarjan(int x) {
- s.push(x);
- dfn[x] = low[x] = ++df;
- for (int i = 0; i < G[x].size(); i++) {
- int p = G[x][i];
- if (!dfn[p]) {
- tarjan(p);
- low[x] = min(low[x], low[p]);
- }
- else if (!clor[p]) {
- low[x] = min(low[x], dfn[p]);
- }
- }
- if (dfn[x] == low[x]) {
- ans++;
- while (1) {
- int a = s.top();
- s.pop();
- clor[a] = ans;
- ins[ans] = a;
- if (a == x) break;
- }
- }
- return 0;
- }
- int find() {
- for (int i = 1; i <= n; i++) {
- if (!dfn[i]) {
- tarjan(i);
- }
- }
- for (int i = 1; i <= n; i++) {
- for (int j = 0; j < G[i].size(); j++) {
- int be = clor[i];
- int en = clor[G[i][j]];
- if (be != en) {
- in[en]++;
- out[be]++;//出
- G2[be].push_back(en);
- }
- }
- }
- for (int i = 1; i <= n; i++) {
- G[i].clear();
- }
- return 0;
- }
- int vis[maxn];
- int dfs(int x) {
- for (int i = 0; i < G2[x].size(); i++) {
- int p = G2[x][i];
- dfs(p);
- vis[x] = vis[p];
- }
- return 0;
- }
- int list[maxn];
- vector<int>cns;
- int main() {
- scanf("%d", &n);
- int x;
- int y;
- for (int i = 1; i <= n ; i++) {
- scanf("%d", &x);
- G[i].push_back(x);
- }
- find();
- if (ans == 1) {
- printf("0\n");
- return 0;
- }
- n = ans;
- int c = 0;
- for (int i = 1; i <= n; i++) {
- if (out[i] == 0) {
- vis[i] = ++c;
- list[c] = i;
- }
- }
- for (int i = 1; i <= n; i++) {
- if (in[i] == 0) {
- dfs(i);
- }
- }
- for (int i = 1; i <= n; i++) {
- if (in[i] == 0) {
- G[vis[i]].push_back(i);
- }
- }
- for (int i = 1; i < c; i++) {
- //list[i]--->G[i+1]
- for (int j = 0; j < G[i + 1].size(); j++) {
- cns.push_back(list[i]);
- cns.push_back(G[i + 1][j]);
- }
- }
- for (int i = 0; i < G[1].size(); i++) {
- cns.push_back(list[c]);
- cns.push_back(G[1][i]);
- }
- printf("%d\n", cns.size() / 2);
- for (int i = 0; i < cns.size(); i+=2) {
- printf("%d %d\n", ins[cns[i]], ins[cns[i + 1]]);
- }
- return 0;
- }
codefoces 22E 图论的更多相关文章
- Codeforces 22E(图论)
题意: 给出n个节点,以及和这个节点指向的节点fi,表示从i能够到达fi,问至少需要添加多少条边能够使得原图变为强连通分量, 输出边数及添加的边,多解输出任意一组解. 2 <= n <= ...
- [leetcode] 题型整理之图论
图论的常见题目有两类,一类是求两点间最短距离,另一类是拓扑排序,两种写起来都很烦. 求最短路径: 127. Word Ladder Given two words (beginWord and end ...
- 并查集(图论) LA 3644 X-Plosives
题目传送门 题意:训练指南P191 分析:本题特殊,n个物品,n种元素则会爆炸,可以转移到图论里的n个点,连一条边表示u,v元素放在一起,如果不出现环,一定是n点,n-1条边,所以如果两个元素在同一个 ...
- NOIp 2014 #2 联合权值 Label:图论 !!!未AC
题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离. ...
- HDU 5521 [图论][最短路][建图灵感]
/* 思前想后 还是决定坚持写博客吧... 题意: n个点,m个集合.每个集合里边的点是联通的且任意两点之间有一条dis[i]的边(每个集合一个dis[i]) 求同时从第1个点和第n个点出发的两个人相 ...
- SDUT 2141 【TEST】数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历
数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem ...
- [转] POJ图论入门
最短路问题此类问题类型不多,变形较少 POJ 2449 Remmarguts' Date(中等)http://acm.pku.edu.cn/JudgeOnline/problem?id=2449题意: ...
- HDU 5934 Bomb 【图论缩点】(2016年中国大学生程序设计竞赛(杭州))
Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- Codeforces 553C Love Triangles(图论)
Solution: 比较好的图论的题. 要做这一题,首先要分析love关系和hate关系中,love关系具有传递性.更关键的一点,hate关系是不能成奇环的. 看到没有奇环很自然想到二分图的特性. 那 ...
随机推荐
- nodeJs学习-03 GET数据请求,js拆解/querystring/url
原生JS解析参数: const http = require('http'); http.createServer(function(req,res){ var GET = {}; //接收数据容器 ...
- lattice planner 规划详解
大家好,我是来自百度智能驾驶事业群的许珂诚.今天很高兴能给大家分享Apollo 3.0新发布的Lattice规划算法. Lattice算法隶属于规划模块.规划模块以预测模块.routing模块.高精地 ...
- js中setInterval与setTimeout用法 实现实时刷新每秒刷新
setTimeout 定义和用法: setTimeout()方法用于在指定的毫秒数后调用函数或计算表达式. 语法: setTimeout(code,millisec) 参数: ...
- Libev源码分析03:Libev使用堆管理定时器
Libev中在管理定时器时,使用了堆这种结构,而且除了常见的最小2叉堆之外,它还实现了更高效的4叉堆. 之所以要实现4叉堆,是因为普通2叉堆的缓存效率较低,所谓缓存效率低,也就是说对CPU缓存的利用率 ...
- selenium webdriver学习(五)------------iframe的处理(转)
selenium webdriver学习(五)------------iframe的处理 博客分类: Selenium-webdriver 如何定位frame中元素 有时候我们在定位一个页面元素的时 ...
- pytorch 优化器调参
torch.optim 如何使用optimizer 构建 为每个参数单独设置选项 进行单次优化 optimizer.step() optimizer.step(closure) 算法 如何调整学习率 ...
- python中break和continue的区别
python中break和continue的区别 break和continue 1.break 意思为结束循环 例: i = 0 while i<10: i+=1 if ...
- H3C 帧中继协议特点
- [转]Springboot和SpringMVC区别
spring boot只是一个配置工具,整合工具,辅助工具. springmvc是框架,项目中实际运行的代码 Spring 框架就像一个家族,有众多衍生产品例如 boot.security.jpa等等 ...
- mysql 第三课 jdbc基础操作
jdbc连接可以大致分为5步: 1.注册驱动 2.获取连接 3.编写语句 4.执行语句 5.关闭连接 其中可以设置参数等等. 1.我们先建一个项目目录: 其中com.etc.dao为数据访问对象 co ...