• 板子|无向图的割点


    /*
    基于Tarjan,去掉Tarjan所有有关于栈的操作 
    判断一个点u(令其儿子为v)是否为割点:
    1. u==root:他的子节点数cnt>1
    2. u!=root:low[u]>=dfn[v]
    			//因为如果low[u]<dfn[v] 则说明u点一定有边可以回溯到v前面形成一个环。 
    */
    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
    const int maxn=200005;
    const int root=1;
    int n,m;
    vector<int> g[maxn];
    int dfn[maxn],low[maxn],t=0;
    bool cutpoint[maxn];
    int ans[maxn],newp=0;
    void init(){
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=m;i++){
    		int u,v;scanf("%d%d",&u,&v);
    		g[u].push_back(v);
    		g[v].push_back(u);
    	}
    }
    void Tarjan(int u){
    	dfn[u]=low[u]=++t;
    	int cnt=0;
    	for(int i=0;i<g[u].size();i++){
    		int v=g[u][i];
    		if(!dfn[v]){
    			cnt++;
    			Tarjan(v);
    			if(u!=root&&low[v]>=dfn[u] || u==root&&cnt>1) cutpoint[u]=1;
    			low[u]=min(low[u],low[v]);
    		}
    		else low[u]=min(low[u],dfn[v]);
    	}
    }
    void out(){
    	for(int i=1;i<=n;i++)
    		if(cutpoint[i]) ans[++newp]=i;
    	printf("%d
    ",newp);
    	for(int i=1;i<=newp;i++) printf("%d ",ans[i]);
    }
    int main(){
    	init();
    	for(int i=1;i<=n;i++) if(!dfn[i]) Tarjan(i);
    	out();
    	return 0;
    }
    
    
  • 相关阅读:
    27.TreeMap
    26.HashCode
    25.HashTable
    myeclipse快捷键
    spring 配置
    jdbcType和javaType对应关系
    Ajax表单提交
    ajax
    JQuery及Form插件使用
    jsp标准数据库
  • 原文地址:https://www.cnblogs.com/saitoasuka/p/9925141.html
Copyright © 2020-2023  润新知