codeforces 962 F Simple Cycles Edges
求简单环,即求点=边数的点双分量,加上判断点和边的模板即可 (简单环模板,区分与点双缩点)
const int maxm = 1e5+; int head[maxm<<], edgecnt, dfn[maxm], low[maxm], bcc_cnt, bccnum[maxm], dfs_clock, s[maxm], top;
vector<int> bcc[maxm], ans; struct edge{
int u, v, nex;
} edges[maxm<<]; void addedge(int u, int v) {
edges[++edgecnt].u = u;
edges[edgecnt].v = v;
edges[edgecnt].nex = head[u];
head[u] = edgecnt;
} void tarjan(int u, int fa) {
dfn[u] = low[u] = ++dfs_clock;
int child = , v;
for(int i = head[u]; i; i = edges[i].nex) {
v = edges[i].v;
if(v == fa) continue;
if(!dfn[v]) {
s[++top] = i;
tarjan(v, u);
low[u] = min(low[u], low[v]);
if(low[v] >= dfn[u]) {
bcc[++bcc_cnt].clear();
int vet = ;
bool ok = true;
while(true) {
int num = s[top--];
bcc[bcc_cnt].push_back((num+)/);
if(bccnum[edges[num].v] != bcc_cnt) {
vet++;
bccnum[edges[num].v]=bcc_cnt;
} else ok = false;
if(edges[num].u == u && edges[num].v == v) break;
}
if(ok && vet>)
for(int i = ; i < bcc[bcc_cnt].size(); ++i)
ans.push_back(bcc[bcc_cnt][i]);
}
} else if(dfn[v] < dfn[u]){
s[++top] = i;
low[u] = min(low[u], dfn[v]);
}
}
} void run_case() {
int n, m, u, v;
cin >> n >> m;
for(int i = ; i <= m; ++i) {
cin >> u >> v;
addedge(u, v), addedge(v, u);
}
for(int i = ; i <= n; ++i)
if(!dfn[i])
tarjan(i, -);
sort(ans.begin(), ans.end());
cout << ans.size() << "\n";
for(int i : ans)
cout << i << " "; } int main() {
ios::sync_with_stdio(false), cin.tie();
run_case();
return ;
}
codeforces 962 F Simple Cycles Edges的更多相关文章
- 点双连通分量F. Simple Cycles Edges
F. Simple Cycles Edges time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- Educational Codeforces Round 42 (Rated for Div. 2)F - Simple Cycles Edges
http://codeforces.com/contest/962/problem/F 求没有被两个及以上的简单环包含的边 解法:双联通求割顶,在bcc中看这是不是一个简单环,是的话把整个bcc的环加 ...
- CF962F Simple Cycles Edges
CF962F Simple Cycles Edges 给定一个连通无向图,求有多少条边仅被包含在一个简单环内并输出 \(n,\ m\leq10^5\) tarjan 首先,一个连通块是一个环,当且仅当 ...
- Simple Cycles Edges CodeForces - 962F(点双连通分量)
题意: 求出简单环的所有边,简单环即为边在一个环内 解析: 求出点双连通分量,如果一个连通分量的点数和边数相等,则为一个简单环 点双连通分量 任意两个点都至少存在两条点不重复的路径 即任意两条边都 ...
- Codeforces962F Simple Cycles Edges 【双连通分量】【dfs树】
题目大意: 给出一个无向图,问有哪些边只属于一个简单环. 题目分析: 如果这道题我们掌握了点双连通分量,那么结论会很显然,找到每个点双,如果一个n个点的点双正好由n条边构成,那么这些边都是可以的. 这 ...
- Codeforces C. A Simple Task(状态压缩dp)
题目描述: A Simple Task time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- [CodeForces 11D] A Simple Task - 状态压缩入门
状态压缩/Bitmask 在动态规划问题中,我们会遇到需要记录一个节点是否被占用/是否到达过的情况.而对于一个节点数有多个甚至十几个的问题,开一个巨型的[0/1]数组显然不现实.于是就引入了状态压缩, ...
- CodeForces - 11D A Simple Task
Discription Given a simple graph, output the number of simple cycles in it. A simple cycle is a cycl ...
- Codeforces 959 F. Mahmoud and Ehab and yet another xor task
\(>Codeforces\space959 F. Mahmoud\ and\ Ehab\ and\ yet\ another\ xor\ task<\) 题目大意 : 给出一个长度为 \ ...
随机推荐
- C:sizeof 运算符
sizeof不是函数,所以不需要包含任何头文件,它的功能是计算一个数据类型的大小,单位为字节 sizeof的返回值为size_t size_t类型在32位操作系统下是unsigned int,是一个无 ...
- JavaSE复习~Java语言发展史
Java概述 什么是Java语言? Java语言是美国Sun公司(Stanford University NetWork),在1995年推出的高级编程语言. 所谓编程语言,是计算机的语言,人们可以使用 ...
- 使用命令将单个java文件打包为jar
思路:先将java文件编译为class文件,然后再打包为jar 参考博文:https://www.cnblogs.com/sxdcgaq8080/p/8126770.html http://www.m ...
- 在VS2017配置OpenGL开发环境
这个方法适合初学者使用,较为简单方便.第一,你的VS2017一定要安装了C/C++开发组件可以打开Visual Studio Installer来查看另外,确定你有安装NuGet包管理器,在单个组件中 ...
- video标签 在微信浏览器打开,不弹出大的独立窗口 而是直接播放。
1.在 video 标签中添加 属性 x5-playsinline playsinline webkit-playsinline="true" 2.ckplayer的 ...
- 移动端 safari苹果手机对大额数字自动变成电话号码
1.苹果手机safari浏览器,用<meta name="format-detection" content="telephone=no">解决.缺 ...
- java窗口程序字符串时间转成时间戳
pom.xml 文件: ?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...
- Python - 同时运行两个以上的脚本
在c.py中 import os os.system("python a.py") os.system("python b.py")
- selenium webdriver 常用方法
/** * 判断元素是否存在 * * @param driver * @param by * @return */ public static boolean isElementPresent(Web ...
- WebService-CXF 学习笔记
什么是CXF Apache CXF = Celtix + Xfire支持多种协议:SOAP1.1,1.2XML/HTTPCORBA(Common Object Request Broker Archi ...