【算法总结】图论相关
2018-04-20 06:58
381 查看
【最近公共祖先】
〖模板代码〗
[倍增算法]
#include<cstdio> #include<algorithm> #include<cstring> #define LL long long using namespace std; const int N=1e5+5; int n,m,x,y,cnt=1,tim,ans; int first ,dfn ,low ; bool iscut ; struct edge{int to,next;}e[N*2]; int read() { int x=0,f=1;char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f; } void ins(int u,int v){e[++cnt]=(edge){v,first[u]};first[u]=cnt;} void tarjan(int x,int fa) { dfn[x]=low[x]=++tim; int son=0; for(int i=first[x];i;i=e[i].next) { int to=e[i].to; if(to==fa)continue; if(!dfn[to]) { son++;tarjan(to,x); low[x]=min(low[x],low[to]); if(low[to]>=dfn[x])iscut[x]=true; } else low[x]=min(low[x],dfn[to]); } if(fa<0&&son<=1)iscut[x]=false; } int main() { n=read();m=read(); for(int i=1;i<=m;i++) { x=read();y=read(); ins(x,y);ins(y,x); } for(int i=1;i<=n;i++) if(!dfn[i])tarjan(i,-1); for(int i=1;i<=n;i++) if(iscut[i])ans++; printf("%d\n",ans); for(int i=1;i<=n;i++) if(iscut[i])printf("%d ",i); return 0; }View Code
相关文章推荐
- 图论相关算法知识总结
- 图论相关算法理解和总结
- COGS NIOP联赛 图论相关算法总结
- 图论算法总结(邻接表描述)
- 二叉树相关算法总结
- 图论算法 有图有代码 万字总结 向前辈致敬
- 图论相关的算法
- Java数据结构和算法总结-字符串相关高频面试题算法
- 算法总结--数组相关】双指针法的常见应用
- 图论相关算法汇总(一)
- 字符串匹配相关算法总结
- [联赛可能考到]图论相关算法——COGS——联赛试题预测
- 近似最近邻问题相关算法总结
- 链表相关算法总结
- 【数学】素数相关算法、结论总结
- 图论相关算法
- 梯度优化算法总结以及solver及train.prototxt中相关参数解释
- 算法作业相关总结
- [置顶] 与位运算相关的编程算法技巧的总结java实现
- 【转】素数相关算法总结