题目连接:http://codeforces.com/contest/962/problem/F

题目大意是定义一个simple cycle为从一个节点开始绕环走一遍能经过simple cycle内任何一个节点,并且不超过一次。

因为是无向图,而且是环,即为连通分量,所以模型转化为求点双连通分量,依据题意求得的点双连通分量需要满足题目simple cycle的定义,所以当一个点双连通分量的边数量和点数量相等时才能构成simple cycle,在tarjan求割点的时候,需要存储点双联通分量的点和边的数量,最后判断一下是否相等,整体存储起来,最终排序一下满足题意的input边的目录。

AC代码:

#include<iostream>
#include<stack>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
using namespace std;
const int maxn = 1e5+7;
struct node{
vector<int> vex;
vector<int> num;
};//建图 vex为node[i]连接的节点,num储存node[i]和vex内节点连接边的序号
struct edge{
int a,b,id;
}E[maxn*2];//a为边的起点,b为边的终点,id为边的输入目录
stack<int> stk;//储存边的目录的栈
node g[100005];
int n,m,tot;
int BCC = 0;//统计BCC
int visit[200014],dfn[100005],low[100005],iscut[100005];
int bcc[100005];
vector<int> ans;
void tarjan(int x,int fa){
int child = 0;
low[x] = dfn[x] = ++tot;
for(int i = 0;i<g[x].vex.size() ;i++){
int tedge = g[x].num[i]; //边序号,后续可以由边序号作为索引找到该边的id(目录)
int temp = E[tedge].b;//temp为边的终点
if(temp == fa){
continue;
}
if(visit[tedge]){
continue;
}
visit[tedge] = visit[tedge^1] = 1;//标记双向边已经访问过
stk.push(tedge);
if(!dfn[temp]){
child++;
tarjan(temp,x);
low[x] = min(low[x],low[temp]);
if(low[temp]>=dfn[x])
{//找到割点,即找到一个点双连通分量
iscut[x] = 1;
BCC++;
set<int> Vset;//存该BCC的点
set<int> Eset;// 存该BCC的边
Vset.insert(x);
int s;
do{
s = stk.top();
stk.pop();
Eset.insert(E[s].id);//加入边的目录id
Vset.insert(E[s].b);//加入边的终点
}while(s!=tedge); if(Eset.size() == Vset.size()){
for(set<int>::iterator it=Eset.begin();it!=Eset.end();it++)
ans.push_back(*it);//以题意要求判断是否为simple cycle
}
}
}
else
{
low[x] = min(low[x],dfn[temp]);
}
}
if(fa == -1 && child <2){
iscut[x] = 0;
}
}
int edgenum = 0;//边的序号从0开始,因为是建立双向边所以两条边标记的序号是异或关系,由边序号可以找到该边的id
void addedge(int u,int v,int id){
E[edgenum].a = u;
E[edgenum].b = v;
g[u].num.push_back(edgenum);
E[edgenum++].id = id;
}
int main(){
int n,m;
cin>>n>>m;
for(int i = 1;i<=m;i++){
int u,v;
cin>>u>>v;
addedge(u,v,i);
addedge(v,u,i);
g[u].vex.push_back(v);
g[v].vex.push_back(u);
}
for(int i = 1;i<=n;i++){
if(!dfn[i]){
tarjan(i,-1);
}
}
int cut = 0;
for(int i = 1;i<=n;i++){
if(iscut[i] == 1){
cut++;
}
}
sort(ans.begin(),ans.end());
cout<<ans.size()<<endl;
for(int i=0;i<(int)ans.size();i++)
cout<<ans[i]<<" ";
//cout<<BCC<<" "<<cut;
return 0;
}

codeforces 962F.simple cycle(tarjan/点双连通分量)的更多相关文章

  1. 【Codefoces487E/UOJ#30】Tourists Tarjan 点双连通分量 + 树链剖分

    E. Tourists time limit per test: 2 seconds memory limit per test: 256 megabytes input: standard inpu ...

  2. Codeforces 521E - Cycling City(点双连通分量+分类讨论)

    Codeforces 题面传送门 & 洛谷题面传送门 大家都是暴力找生成树然后跳路径,代码不到 50 行(暴论)的一说--好,那本蒟蒻决定提供一种代码 150 行,但复杂度也是线性的分类讨论做 ...

  3. CodeForces 97 E. Leaders(点双连通分量 + 倍增)

    题意 给你一个有 \(n\) 个点 \(m\) 条边的无向图,有 \(q\) 次询问,每次询问两个点 \(u, v\) 之间是否存在长度为奇数的简单路径. \(1 \le n, m, q \le 10 ...

  4. [LA3523/uva10195]圆桌骑士 tarjan点双连通分量+奇环定理+二分图判定

    1.一个环上的各点必定在同一个点双连通分量内: 2.如果一个点双连通分量是二分图,就不可能有奇环: 最基本的二分图中的一个环: #include<cstdio> #include<c ...

  5. POJ 3177 Redundant Paths (tarjan边双连通分量)

    题目连接:http://poj.org/problem?id=3177 题目大意是给定一些牧场,牧场和牧场之间可能存在道路相连,要求从一个牧场到另一个牧场要有至少两条以上不同的路径,且路径的每条pat ...

  6. Codeforces962F Simple Cycles Edges 【双连通分量】【dfs树】

    题目大意: 给出一个无向图,问有哪些边只属于一个简单环. 题目分析: 如果这道题我们掌握了点双连通分量,那么结论会很显然,找到每个点双,如果一个n个点的点双正好由n条边构成,那么这些边都是可以的. 这 ...

  7. 【BZOJ-1123】BLO Tarjan 点双连通分量

    1123: [POI2008]BLO Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 970  Solved: 408[Submit][Status][ ...

  8. 图连通性【tarjan点双连通分量、边双联通分量】【无向图】

    根据 李煜东大牛:图连通性若干拓展问题探讨 ppt学习. 有割点不一定有割边,有割边不一定有割点. 理解low[u]的定义很重要. 1.无向图求割点.点双联通分量: 如果对一条边(x,y),如果low ...

  9. tarjan 边双连通分量 对点进行分组 每组点都在一个双连通分量里边

    int dfn[N],low[N],id[N],s[N],p,num,t,son[N];//dfn记录dfs时间戳//low代表当前点到达的最小时间戳,id对点进行分组编号.num是时间戳//s临时存 ...

随机推荐

  1. SmtpStatusCode Enum

  2. 树莓派中安装ubuntu及相关设置

    一.下载并烧录系统 首先准备好我们要烧录的ubuntu_meta系统,可以在树莓派官网中下载https://www.raspberrypi.org/downloads/ 这里我们选择 Raspberr ...

  3. 《深入理解java虚拟机》读书笔记八——第九章

    第九章 类加载及执行子系统的案例与实战 Q:如果有10个WEB应用程序都是用Spring来进行组织管理的话,可以把Spring放到Common或Shared目录下(Tomcat5.0)让这些程序共享. ...

  4. 解决jquery.pjax加载后的异常滚动

    个人博客 地址:http://www.wenhaofan.com/article/20181106154356 在使用jquery.pjax的时候发现每次加载完成后都会将滚动条滚动至顶部,用户体验极不 ...

  5. SMTS Silicon Design Engineer Location: Beijing, Beijing, CN

    https://jobs.amd.com/job/Beijing-Physical-Design-Engineer-Beij/603603700/?locale=en_US What you do a ...

  6. 谈谈近期学习Nativejs和reactNative的一些感受

    因为前段时间,对dcloud推出的Nativejs和facebook推出的reactNative都做了一点点浅薄的研究.因为研究的很浅薄,所以仅代表我个人观点,谈谈对运用这两个产品的些许感受. 说起d ...

  7. AUI前端框架总结

    AUI 是Apicloud 的手机端UI第三方,需要引入Apicloud和AUI中的css样式和js框架 **首先:手机项目必须配置config.xml文件 Apicloud官网有详解 ** 其次:程 ...

  8. 控制台测试ajax

    有的时候需要测试下web项目中post.get请求是否正确,但是这个时候电脑上没有安装测试工具,怎么办呢?直接用浏览器控制台测试,打开网站,F12控制台,在控制台下复制粘贴下面的ajax请求,之后aj ...

  9. 呼叫到达率100%,网易云信信令SDK免费上线!

    近期,网易云信推出一款稳定可靠.到达率高.扩展性较强的信令通道产品--信令SDK.它能够提供可靠的消息通道,可用于搭建音视频场景下的呼叫邀请机制.信令SDK目前兼容市面上所有主流的音视频SDK,呼叫到 ...

  10. [CCPC2019秦皇岛] F. Forest Program

    [CCPC2019秦皇岛 F] Link https://codeforces.com/gym/102361/problem/F Description 给定一个仙人掌,删去一些边可以让它变成一个森林 ...