强连通分量 Tarjan模板 , 割点模板,割边(桥)模板 , 缩点

1.输出各强连通分量

      浅析强连通分量(Tarjan和kosaraju)Tarjan模板 

      例题(求强连通分量的个数)

#include 
#include 
#include 
#include 
using namespace std;
const int maxn=10005;
const int maxm=100005;
int n,m,idx=0,k=1,Bcnt=0;
int head[maxn];
int ins[maxn]={0};
int dfn[maxn]={0},low[maxn]={0};
//int Belong[maxn];
stack  s;
struct edge
{
    int v,next;
}e[maxm];
int min(int a,int b)
{
    return a

2.割点模板

      例题(求割点数目)

      如果想输出各个割点,只需通过迭代器访问set即可。

# include
# include
# include
# include 
# include
# define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int maxn=1000;
int low[maxn],dfn[maxn],root,now,m;
vectorg[maxn];
setans;   //ans用来盛装割点
void init(){
	now=0;
	mem(dfn,0);
	mem(low,0);
	ans.clear();
    for( int i = 0; i < maxn; i++ ) g[i].clear();
} 
void addedge(int u,int v){
	g[u].push_back(v);
	g[v].push_back(u);
}
void tarjan(int u,int fa){
	low[u]=dfn[u]=++now;
	int len=g[u].size();
	int son=0;
	for(int i=0;i1){
				ans.insert(u);
			}else if(u!=root&&dfn[u]<=low[v]){
				ans.insert(u);
			}
		}else{
			low[u]=min(low[u],dfn[v]);
		}
	}
}
int main(){
	while(scanf("%d",&m)&&m!=0)
    {
        init();
        int n;
        while(scanf("%d",&n)&&n!=0)
        {
            while(getchar()!='\n')
            {
                int a;
                scanf("%d",&a);
                addedge(n,a);
            }
        }
        root=1;
        
        tarjan(1,-1);
       
        printf("%d\n",ans.size());
    }
    return 0;
}

3.割边(桥)模板

例题

# include
# include
# include
# include 
# include
# include
# define mem(a,b) memset(a,b,sizeof(a))
# define p pair
using namespace std;
const int maxn=1e5+5;
int low[maxn],dfn[maxn],now,ecnt;
vectorg[maxn];
//set

ans; //pair型的ans同时容纳一条边的两个端点 (不知为啥会wa) struct Ans{ int u,v; }ans[maxn]; //ans容纳一条边的两个端点 void init(){ ecnt=0; now=0; mem(dfn,0); mem(low,0); mem(ans,0); for( int i = 0; i < maxn; i++ ) g[i].clear(); } int cmp(Ans a,Ans b){ if(a.u>b.u) return a.ub.v) return a.vb) swap(a,b); ans[ecnt].u=a,ans[ecnt].v=b; ecnt++; } }else{ low[u]=min(low[u],dfn[v]); } } } int main(){ int n, x, y, m; while (scanf("%d", &n) != EOF) { init(); for (int i = 0; i < n; ++i) g[i].clear(); for (int i = 0; i < n; ++i) { scanf("%d (%d)", &x, &m); for (int j = 0; j < m; ++j) { scanf("%d", &y); addedge(x, y); } } for (int i = 0; i < n; ++i) { if (dfn[i]) continue; tarjan(i, i); } //int sum = ans.size(); // printf("%d critical links\n", sum); // set

::iterator it=ans.begin(); //迭代器访问ans // for (;it!=ans.end();it++) { // printf("%d - %d\n", *it); //一个*it包含pair中的两个int (wa) // } sort(ans,ans+ecnt,cmp); cout<

4.缩点

题目

#include 
#include 
#include 
#include 
using namespace std;

const int maxm=50050;
int n,m,idx=0,k=1,Bcnt=0;
int head[maxm];
int ins[maxm]={0};
int dfn[maxm]={0},low[maxm]={0};
int Belong[maxm];
int outdegree[maxm]; 
stack  s;
struct edge
{
    int v,next;
}e[maxm];
int min(int a,int b)
{
    return a

阿里云建站—为企业提供互联网“快”服务

2020年因为一场突如其来的疫情,不少企业受到了严重冲击,疫情的冲击力对传统“纯线

下”行业的危害最大,互联网女皇玛丽·米克(MaryMeeker)4月17日发布了著名的年度互

联网趋势报告,报告中指出:拥有强大的互联网线上线下融合能力的企业在疫情中的表现最好,

线上线下融合的趋势已经存在一段时间了,但是疫情让这种需求变得更加的迫切。

如果你的企业完全依附于传统的、纯线下的经验模式,那么在2020年你将“必死无疑”,

一场巨大的,前所未有的互联网革命已经到来!

阿里云建站为了助力各行各业复工复产,疫情期间“马不停蹄”为数以万计的企业快速完成

建站,为他们朝着“线上线下融合”或者“纯线上”的互联网经营模式迈进,打下了坚实的基础。

“云·速成美站”模板建站1天就能上线,不懂技术没关系,打字就能建网站。千套网站模

板免费提供,百元就能建官网,一价全包,无任何隐形消费。

“云·企业官网”定制建站1周就能上线,高端量身定制建站,千元建官网无需自己动手,

建站专家1对1网站策划及设计,专业省心之选。

疫情,是一场大浪淘沙,每一次危机背后都隐藏着机会,危机越大,机会也越大。大环境

已经改变,如果你不努力不去改变来迎合这个大环境,那你必将被淘汰。

阿里云助力企业建站,优惠多多,福利多多,详情请点击如下链接

红包+折扣,阿里云上云大礼包!https://www.aliyun.com/minisite/goods?userCode=

你可能感兴趣的:(强连通分量 Tarjan模板 , 割点模板,割边(桥)模板 , 缩点)