【UOJ67】【JZOJ4679】种树
2016-08-11 19:20
246 查看
Description
原题在:http://uoj.ac/problem/67
Solution
首先确定树的概念:有n个点,n-1条边的无向连通图。那么现在我们有n个点m条边,我们现在要删除一个点u首先要满足原图要联通,然后才满足树的条件。
那么,用Tarjan求出所有割点,那么非割点去掉后仍保持联通,那么在此基础上判断是否是树即可。
Code
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #define fo(i,j,k) for(int i=j;i<=k;i++) #define fd(i,j,k) for(int i=j;i>=k;i--) #define N 100001 #define M 200001 #define ll long long using namespace std; int to[M],next[M],last[M],num=0; int ds ; int c ; bool bz ; bool r ; void link(int x,int y) { num++; to[num]=y; next[num]=last[x]; last[x]=num; } int dfn ,low ; int dep=0; int cut ; void tarjan(int x) { low[x]=dfn[x]=++dep; for(int i=last[x];i;i=next[i]) { int v=to[i]; if(!dfn[v]) { tarjan(v); low[x]=min(low[x],low[v]); if(low[v]>=dfn[x]) cut[x]++; } else low[x]=min(low[x],dfn[v]); } } int main() { int n,m; cin>>n>>m; fo(i,1,m) { int u,v; scanf("%d %d",&u,&v); ds[u]++; ds[v]++; link(u,v); link(v,u); } fo(i,1,n) if(!dfn[i]) cut[i]--,tarjan(i); fo(i,1,n) if(cut[i]<=0) { if(n-2==m-ds[i]) c[++c[0]]=i; } cout<<c[0]<<endl; fo(i,1,c[0]) printf("%d ",c[i]); }
相关文章推荐
- 【UOJ 67】【JZOJ 4679】种树
- JZOJ 4679【NOIP2016提高A组8.11】种树
- 【UOJ #67】【JZOJ 4679】种树
- JZOJ 4679 种树【NOIP2016提高A组8.11】
- JZOJ4753【GDOI2017模拟9.4】种树 LCT维护子树信息+换根时维护Dfs序(CC MONOPLOY加强版)
- JZOJ[5445]字典序 题解
- JZOJ 1980. 【2011集训队出题】Construct
- JZOJ 4366. 【GDKOI2016】项链
- 【JZOJ 3976】【NOI2015模拟1.17】⑨
- [JZOJ5523] +/-
- 【JZOJ 4330】【清华集训模拟】几何题
- Jzoj2309 辽哥游戏
- Day 1 jzoj 1500. 秤
- JZOJ 1846. 【东莞市选2014】能源大亨(energy.pas/cpp)
- jzoj3621 【BOI2011】Time is money (最小乘积系列:生成树)
- jzoj3654 【APIO2014】回文串(palindrome) (回文树、自动机)
- JZOJ(中山纪中) 2018.01.26【NOIP普及组】模拟赛D组 第三题
- JZOJ 1778 洛谷 2024 食物链