求大佬帮我看看求双连通分量的tarjan错哪了
  • 板块学术版
  • 楼主fyc_LC
  • 当前回复1
  • 已保存回复1
  • 发布时间2025/7/27 21:51
  • 上次更新2025/7/28 11:18:55
查看原帖
求大佬帮我看看求双连通分量的tarjan错哪了
1059675
fyc_LC楼主2025/7/27 21:51
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
vector<int> g[N],T[2*N];
int ct_new;
int dfn[N],low[N];
int st[N],sj=0;
int cnt=0;

void tarjan(int p){	
	cnt++;
	low[p]=dfn[p]=cnt;
	sj++;
	st[sj]=p;
	for(int i=0;i<g[p].size();i++){
		if(dfn[g[p][i]]==0){
			tarjan(g[p][i]);
			low[p]=min(low[p],low[g[p][i]]);
			if(dfn[p]<=low[g[p][i]]){
				ct_new++;
				int x=0;
				cout<<ct_new<<" }"<<p<<"]]]";
				for(sj;st[sj]!=p;sj--){
					x=st[sj];
					cout<<x<<" ";
					T[x].push_back(ct_new);
					T[ct_new].push_back(x);
				}
				T[p].push_back(ct_new);
				T[ct_new].push_back(p);
				cout<<p<<" \n";
			}
		}
		else{
			low[p]=min(low[p],dfn[g[p][i]]);
		}
	}
	return;
}
int dep[N],fa[N][30];
void dfs(int p,int f){
	dep[p]=dep[f]+1;
	cout<<p<<"]"<<dep[p];
	fa[p][0]=f;
	for(int i=1;i<=21;i++){
		fa[p][i]=fa[fa[p][i-1]][i-1];
	}
	//cout<<T[p].size();
	for(int i=0;i<T[p].size();i++){
		//cout<<"A";
		if(T[p][i]!=f){
			dfs(T[p][i],p);
			//cout<<"ASD";
		}
	}
	return;
}
int lca(int l,int r){
	if(dep[r]>dep[l]) swap(l,r);
	for(int i=21;i>=0;i--){
		if(dep[fa[l][i]]>=dep[r]){
			l=fa[l][i];
		}
	}
	if(l==r) return l;
	for(int i=21;i>=0;i--){
		if(fa[l][i]!=fa[r][i]){
			l=fa[l][i];
			r=fa[r][i];
		}
	}
	return fa[l][1];
}
int main(){
	int n,m,q;
	cin>>n>>m>>q;
	ct_new=n;
	int u,v;
	for(int i=1;i<=m;i++){
		cin>>u>>v;
		g[u].push_back(v);
		g[v].push_back(u); 
	}
	tarjan(1);
	cout<<T[7].size();
	//cout<<T[7].size();
	//dfs(1,1);
	//cout<<dep[1];
//	for(int i=1;i<=q;i++){
//		cin>>u>>v;
//		cout<<dep[u]<<" "<<dep[v]<<" "<<dep[lca(u,v)]<<" "<<dep[u]+dep[v]-2*dep[lca(u,v)]-2<<"\n";
//	}
	return 0;
}
2025/7/27 21:51
加载中...