zoukankan      html  css  js  c++  java
  • 割点

    定义

    如果一个图删去某个点后被分成了两个部分,那么称这个点为图的割点

    求法

    Tarjan过程中记录low,dfn,然后如果一个点的儿子中的low值>=当前点的dfn值,那么显然它是割点.

    Code

    洛谷模板

    #include<stdio.h>
    #include<stdlib.h>
    #include<iostream>
    using namespace std;
    const int maxn=1000010,maxm=200010;
    struct node{
    	int to,nxt;
    }e[maxm];
    int front[maxn],cnt,dfn[maxn],low[maxn],ins[maxn],sta[maxn],num,tim;
    int cut[maxn];
    void Add(int u,int v){
    	e[++cnt]=(node){v,front[u]};front[u]=cnt;
    	e[++cnt]=(node){u,front[v]};front[v]=cnt;
    }
    void Tarjan(int u,int root){
    	dfn[u]=low[u]=++tim;
    	int son=0;
    	for(int i=front[u];i;i=e[i].nxt){
    		int v=e[i].to;
    		if(!dfn[v]){
    		    son++;
    			Tarjan(v,root);
    			low[u]=min(low[u],low[v]);
    			if(dfn[u]<=low[v] && u!=root)cut[u]=1;
    		}
    		low[u]=min(low[u],dfn[v]);
    	}
    	if(u==root && son>1)cut[u]=1;
    }
    int main(){
    	int i,j,k,n,m;
    	scanf("%d%d",&n,&m);
    	for(i=1;i<=m;i++){
    		int x,y;
    		scanf("%d%d",&x,&y);
    		Add(x,y);
    	}
    	for(i=1;i<=n;i++)
    		if(!dfn[i])Tarjan(i,i);
        int ans=0;
    	for(i=1;i<=n;i++)
    		if(cut[i])ans++;
    	printf("%d
    ",ans);
    	for(i=1;i<=n;i++)
    		if(cut[i])printf("%d ",i);
    	return 0;
    }
    
  • 相关阅读:
    如何增加按钮的点击间隔时间
    如何增加button的点击范围
    定时器Timer的使用
    NSCache
    GCD和NSOperation的区别
    NSOperation实现线程间通信
    NSOperation添加操作依赖和监听
    自定义NSOperation
    NSOperation的多线程
    单例的实现(完整版代码)
  • 原文地址:https://www.cnblogs.com/RJ-NH/p/9093478.html
Copyright © 2011-2022 走看看