求助
查看原帖
求助
793625
Pink_Cut_Tree楼主2024/1/8 17:01

AC,最慢的跑了 333ms333\text{ms}。

时间复杂度不应该是 O(Tn)\mathcal O(Tn) 吗?

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5; 
int T;
int n;
int u,v;
vector<int>G[N];
int dep[N]; //代表的节点的深度
int siz[N]; //代表节点的子树大小和 
void dfs(int u,int fa){ //目前dfs到了节点u,它的父节点是节点fa 
	siz[u]=1; //子树大小是1 
	dep[u]=dep[fa]+1; //深度是父节点深度+1 
	for(int i=0;i<G[u].size();i++){
		int v=G[u][i]; //与之相连的节点
		if(v==fa){ //如果是父节点 
			continue;
		} 
		dfs(v,u); //去dfs节点v,它的父节点是节点u
		siz[u]+=siz[v];
	}
}
int main(){
	cin.tie(0)->sync_with_stdio(0);
	cin>>T;
	while(T--){
		cin>>n;
		for(int i=1;i<=n;i++){
			G[i].clear();
		}
		for(int i=1;i<n;i++){
			cin>>u>>v;
			G[u].push_back(v);
			G[v].push_back(u);
		}
		dfs(1,-1);
		for(int i=1;i<=n;i++){
			cout<<dep[i]<<" "<<n-siz[i]+1<<"\n";
		}
	}
return 0;
}
2024/1/8 17:01
加载中...