「2018-12-02模拟赛」T2 种树 解题报告
2.种树(tree.pas/cpp/in/out)
问题描述:
Fanvree 很聪明,解决难题时他总会把问题简单化。
例如,他就整天喜欢把图转化为树。但是他不会缩环,那他怎么转化呢? 这是一个有
n 个点 m 条双向边的图,Fanvree 会选定一个节点,然后删掉这个节点和这个点连出去的边,
如果变成了一棵树,那么这个节点便是可行的,什么是树呢?树也即无简单环的无向连通图。
告诉 Fanvree 可能的节点是什么。
输入:
第一行两个正整数 n 和 m,表示有 n 个点 m 条边,保证 n≥2。
接下来 m 行,每行两个整数 v,u,表示 v 和 u 之间有一条无向边 1≤v,u≤n,保证没
有重边和自环。
输出:
第一行一个正整数 ns,表示这个图中有 ns 个结点可选。
接下来一行,共 ns 个整数,每个整数表示一个可选结点的编号。
请按编号从小到大的顺序输出。
数据保证图中至少存在一个可选的结点。
样例输入:
6 6
1 2
1 3
2 4
2 5
4 6
5 6
样例输出:
3
4 5 6
数据范围:
对于 40%的数据:n,m<=1000;
另外存在 10%的数据:m=n-1;
另外存在 20%的数据:m=n;
对于 100%的数据:n,m<=100000。
写在前面
只要掌握一个小定理,就显得十分简单(啊呸,叫我这种刚刚普及退役\(Tarjan\)都不会蒟蒻找割点)
当且仅当一个有N个节点的连通图有N - 1条边,这是一棵树。
思路
输入时,记录每个点相连的边数s。
如果 M - s[P] != N - 2,该图不满足前面提到的定理,删去P不是一棵树。
如果该点为割点,那么删去P将不连通。
所以预处理出割点、每个点相连的边数即可。
代码
#include<bits/stdc++.h>
using namespace std;
#define open(s) freopen( s".in", "r", stdin ), freopen( s".out", "w", stdout );
#define MAXN 100005
#define MAXM 100005
int n, m, ans;
int hd[MAXN], nxt[MAXM << 1], to[MAXM << 1], s[MAXN], tot(1);
void Add( int x, int y ){ nxt[++tot] = hd[x]; to[tot] = y; hd[x] = tot; }
int dfn[MAXN], low[MAXN], num, root;
bool cut[MAXN];
void Tarjan( int x ){ //找割点——
dfn[x] = low[x] = ++num; int cnt(0);
for ( int i = hd[x]; i; i = nxt[i] ){
if ( !dfn[to[i]] ){
Tarjan(to[i]);
low[x] = min( low[x], low[to[i]] );
if ( dfn[x] <= low[to[i]] ) cnt++;
} else low[x] = min( low[x], dfn[to[i]] );
}
if ( cnt && ( x != root || cnt > 1 ) ) cut[x] = 1;
}
int main(){
open("tree");
scanf( "%d%d", &n, &m );
for ( int i = 1; i <= m; ++i ){
int x, y; scanf( "%d%d", &x, &y );
Add( x, y ), Add( y, x ); s[x]++; s[y]++;
}
root = 1; Tarjan(1);
//别忘了 如果图是由一棵树和一个孤零零的点组成。。。
if ( num == 1 ){ //不连通的话,如果找到的点只有1个(节点1),那只有可能节点1是满足要求的点
root = 2; Tarjan( 2 );
if ( num == n && m == n - 2 ) printf( "1\n1\n" );
return 0;
}
if ( num == n - 1 ){ //如果找到的点有n - 1个,那么在非节点1的节点中有一个还满足题要求。。。
if ( m == n - 2 ){
printf( "1\n" );
for ( int i = 2; i <= n; ++i )
if ( !dfn[i] ){ printf( "%d\n", i ); break; }
}
return 0;
}
if ( num != n ){ printf( "0\n0\n" ); return 0; } //如果有多个点不能到达,咋删都成不了棵树。。。
for ( int i = 1; i <= n; ++i ) if ( m - s[i] == n - 2 && !cut[i] ) ans++; //边数符合、不是割点,它一定是棵树!
printf( "%d\n", ans );
for ( int i = 1; i <= n; ++i ) if ( m - s[i] == n - 2 && !cut[i] ) printf( "%d ", i );
return 0;
}
「2018-12-02模拟赛」T2 种树 解题报告的更多相关文章
- Solution -「牛客 NOIP 模拟赛」打拳
\(\mathcal{Description}\) 现 \(2^n\) 个人进行淘汰赛,他们的战力为 \(1\sim 2^n\),战力强者能战胜战力弱者,但是战力在集合 \(\{a_m\}\) 里 ...
- nowcoder 提高组模拟赛 最长路 解题报告
最长路 链接: https://www.nowcoder.com/acm/contest/178/A 来源:牛客网 题目描述 有一张 \(n\) 个点 \(m\) 条边的有向图,每条边上都带有一个字符 ...
- 安徽师大附中%你赛day9 T2 富 解题报告
富 题目背景 出于某些原因, 苟先生在追杀富先生. 题目描述 富先生所在的地方是一个\(n\times m\)的网格,苟先生排出了他的狼狗大军,共有\(k\)条狗,第\(i\)条狗所在的位置为\((x ...
- 安徽师大附中%你赛day7 T2 乘积 解题报告
乘积 题目背景 \(\mathrm{Smart}\) 最近在潜心研究数学, 他发现了一类很有趣的数字, 叫做无平方因子数. 也就是这一类数字不能够被任意一个质数的平方整除, 比如\(6\).\(7\) ...
- nowcoder(牛客网)提高组模拟赛第四场 解题报告
T1 动态点分治 就是模拟..... 但是没有过!! 看了题解之后发现.... 坑点:有可能 \(x<=r\),但是
- 2018 ACM南京网络赛H题Set解题报告
题目描述 给定\(n\)个数$a_i$,起初第\(i\)个数在第\(i\)个集合.有三种操作(共\(m\)次): 1 $u$ $v$ 将第$u$个数和第$v$个数所在集合合并 2 $u$ 将第$u$个 ...
- 「CSP-S模拟赛」2019第四场
「CSP-S模拟赛」2019第四场 T1 「JOI 2014 Final」JOI 徽章 题目 考场思考(正解) T2 「JOI 2015 Final」分蛋糕 2 题目 考场思考(正解) T3 「CQO ...
- #10471. 「2020-10-02 提高模拟赛」灌溉 (water)
题面:#10471. 「2020-10-02 提高模拟赛」灌溉 (water) 假设只有一组询问,我们可以用二分求解:二分最大距离是多少,然后找到深度最大的结点,并且把它的\(k\)倍祖先的一整子树删 ...
- #10470. 「2020-10-02 提高模拟赛」流水线 (line)
题面:#10470. 「2020-10-02 提高模拟赛」流水线 (line) 题目中的那么多区间的条件让人感觉极其难以维护,而且贪心的做法感觉大多都能 hack 掉,因此考虑寻找一些性质,然后再设计 ...
随机推荐
- Python基础:22__slots__类属性
1:工厂函数 由于类型和类的统一,因而可以子类化Python数据类型.但是所有的Python 内建的转换函数现在都是工厂函数.当这些函数被调用时,你实际上是对相应的类型进行实例化.比如下面的函数都已经 ...
- 9 模版语言 jinja2
from flask import Flask,redirect,render_template,jsonify,send_file,request,Markup,sessionimport json ...
- SuperSocket性能数据采集的应用程序接口的改动
性能数据采集的应用程序接口作了修改,两个虚方法已经被更改: protected virtual void UpdateServerSummary(ServerSummary serverSummary ...
- Codeforces Round #168 (Div. 1 + Div. 2)
A. Lights Out 模拟. B. Convex Shape 考虑每个黑色格子作为起点,拐弯次数为0的格子构成十字形,拐弯1次的则是从这些格子出发直走达到的点,显然需要遍历到所有黑色黑色格子. ...
- 2018-2-13-C#-枚举转字符串
title author date CreateTime categories C# 枚举转字符串 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17:23:3 ...
- 安装 NodeJ Koa2、3 + 独立插件 cli脚手架 npm cnpm Vue
安装 NodeJ npm cnpm Koa2.3 + 独立插件 cli脚手架 Vue 安装 在 这里写过了 这两个分开了写 Nodej:下载 node.js 安装 10.0版 ...
- 安装scipy失败提示lapack not found
从python库网站下载numpy+mkl合集包通过pip安装在下载scipy安装包通过pip安装即可
- webmagic笔记
在class Spider中有run函数,调用了 processRequest(requestFinal)完成对页面的下载和处理.在这个函数里面先调用downloader.download(reque ...
- 2018-12-14-恢复-U-盘隐藏文件夹
title author date CreateTime categories 恢复 U 盘隐藏文件夹 lindexi 2018-12-14 19:24:56 +0800 2018-12-14 19: ...
- Vue 子组件传父组件
vue中的传值是个很烦的问题,记录一下自己完成的这个需求. 首先,被引用的称之为子组件,当前页面为父组件,这个不能搞错. 子组件传值,要用到this.$emit. 子组件页面,需要在一个函数中使用th ...