题意:

n个点m条边的无向图,问有哪些边在一个简单环上,按顺序输出这些边的编号

思路:

对于无向图求出每个双联通分量,对于每个双联通分量,如果点的个数==边的个数,那么这个双联通分量就是个简单环,输出这个双联通分量的所有边,否则不是

这道题如果直接搜割点是不对的,两个特殊样例如下:

  • 对于样例①:割点是1,2,3,这样子的话很有可能只会找到3个双联通分量(1-4-5,2-6-7,3-8-9-10)从而将边算少
  • 对于样例②:割点是3,6,但是边(3,5)和(5,6)有可能被割点从它所属的双联通分量中分离,从而将边算多

解决方法:

直接在求双联通分量时用栈维护当前的边即可,而不用求割点后DFS,具体过程看代码注释

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<string>
#include<math.h>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
#define LL long long
#define mod 1000000007
vector<int> G[200005], F[200005];
stack<int> st, temp;
int cnt, t, cut, low[200005], time[200005], ans[200005], vis[200005], to[200005];
void Trajan(int u, int p, int last)
{int i, v, flag, now;low[u] = time[u] = ++t;for(i=0;i<G[u].size();i++){v = G[u][i];if(v==p)continue;//printf("%d %d\n", u, v);if(time[v]==0){to[F[u][i]] = v;st.push(F[u][i]);Trajan(v, u, F[u][i]);low[u] = min(low[u], low[v]);if(time[u]==low[v])       //u点是割点{cut++, flag = 1;while(1){now = st.top();st.pop();//printf("%d %d\n", u, now);temp.push(now);if(vis[to[now]]!=cut)        //对于当前双联通分量中的每一条边,它们一个方向上的终点应该没有重复vis[to[now]] = cut;elseflag = 0;if(now==F[u][i])break;}while(temp.empty()==0){if(flag)ans[++cnt] = temp.top();temp.pop();}}}else if(time[v]<time[u]){to[F[u][i]] = v;st.push(F[u][i]);low[u] = min(low[u], time[v]);}}if(st.empty()==0 && st.top()==last)        //当前边为桥{//printf("%d %d\n", u, last);printf("%d\n", last);st.pop();}
}
int main(void)
{int n, m, i, x, y;scanf("%d%d", &n, &m);for(i=1;i<=m;i++){scanf("%d%d", &x, &y);G[x].push_back(y), F[x].push_back(i);G[y].push_back(x), F[y].push_back(i);}for(i=1;i<=n;i++){if(time[i]==0)Trajan(i, 0, 0);}sort(ans+1, ans+cnt+1);printf("%d\n", cnt);for(i=1;i<=cnt;i++)printf("%d ", ans[i]);puts("");return 0;
}

双联通分量求简单环(Educational Codeforces Round 42: F. Simple Cycles Edges)相关推荐

  1. Educational Codeforces Round 42 (Rated for Div. 2)

    Link C. Make a Square 题意 给你一个数N,你可以在其中删除几位,使剩下的数字组成一个新数是个平方数,问最小的删除位数,不能的话输出' -1 ' 分析 D. Merge Equal ...

  2. A、B、C、D、Educational Codeforces Round 42 (Rated for Div. 2)

    Educational Codeforces Round 42 (Rated for Div. 2)  http://codeforces.com/contest/962 A:Equator 这里需要 ...

  3. Educational Codeforces Round 14 - F (codeforces 691F)

    题目链接:http://codeforces.com/problemset/problem/691/F 题目大意:给定n个数,再给m个询问,每个询问给一个p,求n个数中有多少对数的乘积≥p 数据范围: ...

  4. Educational Codeforces Round 51: F. The Shortest Statement(最短路+LCA)

    F. The Shortest Statement 题意: n个点m条边(m≤n+20)的无向连通图,Q次询问,每次求出给定两点的最短路 思路: 将题意转换一下,给你一棵n个节点的树,并且这个树上还有 ...

  5. Educational Codeforces Round 9 F. Magic Matrix 最小生成树

    F. Magic Matrix 题目连接: http://www.codeforces.com/contest/632/problem/F Description You're given a mat ...

  6. Educational Codeforces Round 12 C. Simple Strings 贪心

    C. Simple Strings 题目连接: http://www.codeforces.com/contest/665/problem/C Description zscoder loves si ...

  7. Educational Codeforces Round 12 D. Simple Subset 最大团

    D. Simple Subset 题目连接: http://www.codeforces.com/contest/665/problem/D Description A tuple of positi ...

  8. Educational Codeforces Round 39 F Largest Beautiful Number

    传送门 暴力DP dp[i][j][k] 从j 到 k 发f(x) 的大小, #include <bits/stdc++.h> using namespace std; typedef l ...

  9. Educational Codeforces Round 50: F. Relatively Prime Powers(莫比乌斯函数)

    F. Relatively Prime Powers 题意: 给你一个n,问满足在[2,n]范围内有多少个数是非次方数(也就是不是这样的) 思路: 答案就是 原理是利用容斥,注意n开i次根是向下取整( ...

最新文章

  1. 【ngx-ueditor】百度编辑器按下Shift键不触发contentChange事件
  2. 【鬼网络】之DNS域名解析服务
  3. 阿里云的工程师要被祭天了?
  4. “21天好习惯“第一期-4
  5. Java基础知识面试题
  6. 利用GPU加速的软件
  7. 手动推jar包及查看jar包启动情况
  8. UART嵌入式通信协议(以AVR单片机为例)
  9. 雅虎、领英接连退出中国,开发者:GitHub 也会受到影响吗?
  10. 手机android怎么开机画面,Android使用BroadcastReceiver实现手机开机之后显示画面的功能...
  11. 【图像隐藏】基于matlab像素预测和位平面压缩的加密图像可逆数据隐藏【含Matlab源码 2218期】
  12. 什么是Vue全家桶,Vue全家桶包含哪些东西以及怎么使用
  13. app通过电商变现方式探讨
  14. php邮件群发系统日发5000,最新qq邮件群发日发10000封邮件
  15. HistoryDAO:重塑历史的记录方式
  16. Qt编写安防视频监控系统25-离线地图
  17. 传奇服务器如何修改装备,架设传奇私服时怎样修改装备图标
  18. 多模态分析数据集(Multimodal Dataset)整理
  19. Python调用Unit闲聊对话API的应用
  20. 关于Abaqus+python提取s11残余应力(按路径提取)

热门文章

  1. python是什么意思怎么读-python怎么读(python怎么读中文)
  2. python创建txt文件并写入-python创建txt文件
  3. python爬虫怎么赚钱-利用Python爬虫轻松挣外快的几个方法(值得收藏)
  4. python 代码命令大全-深度学习中python常用命令
  5. python简单代码-Python简单进程锁代码实例
  6. 语音识别准确率终于提升了 以后可以随时和机器人聊天
  7. 10个PHP常见安全问题(实例讲解)
  8. java中string类的常用方法举例说明
  9. sqlplus必须要安装oracle吗,不安装oracle客户端使用sqlplus
  10. matlab中弹性碰撞课程设计,完全弹性碰撞matlab.doc