tarjan割点,10分求助
查看原帖
tarjan割点,10分求助
107527
chenkaiwen楼主2021/10/4 21:08
#include<bits/stdc++.h> 
using namespace std;
int n,m;
int dfn[10101],low[10101],cnt=0;
long long ans[10101],size[10101];
bool IF[10101];
vector<int>G[10101];
void add(int u,int v){
	G[u].push_back(v);
	G[v].push_back(u);
}
void tarjan(int u){
	dfn[u]=low[u]=++cnt;
	size[u]=1;
	int flag=0,sum=0;
	for(int i=0;i<G[u].size();i++){
		int v=G[u][i];
		if(!dfn[v]){
			tarjan(v);
			size[u]+=size[v];
			low[u]=min(low[u],low[v]);
			if(low[v]>=dfn[u]){
				ans[u]+=1ll*size[v]*(n-size[v]);
				sum+=size[v];
				flag++;
				if(u!=1)IF[u]=1;
				if(flag>1)IF[u]=1;
			}
		}else low[u]=min(low[u],dfn[v]);
	}
	if(IF[u])ans[u]+=1ll*((n-sum-1)*(sum+1)+n-1);
	else ans[u]=2*(n-1);
}
void In(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		int t1,t2;
		scanf("%d%d",&t1,&t2);
		add(t1,t2);
	}
}//                
void Work(){
	tarjan(1);
	for(int i=1;i<=n;i++)printf("\t\t%d %d\n",IF[i],ans[i]);
}
int main(){
	In();
	Work();
	return 0;
}

只有第3个点过了

2021/10/4 21:08
加载中...