考察连通分量个数,用搜索或并查集,并查集效率较高;
求最深的树根节点,用dfs
// 1021. Deepest Root.cpp: 主项目文件。 #include "stdafx.h" #include <cstdio> #include <cstring> #include <vector> using namespace std; const int N=10003; bool used[N]; vector<int> edge[N]; vector<int> needRoot; int maxLevel,tLevel,n; void dfs(int cur,int level){ used[cur]=true; if(level>=tLevel) tLevel=level; for(vector<int>::iterator ite=edge[cur].begin();ite!=edge[cur].end();ite++){ if(!used[*ite]){ dfs(*ite,level+1); } } } int countTrees(){ int cnt=0; tLevel=-1; memset(used,0,sizeof(used)); for(int i=1;i<=n;i++){ if(!used[i]){ dfs(i,1); ++cnt; } } return cnt; } void computeDeepestRoot(){ maxLevel=-1; for(int i=1;i<=n;i++){ memset(used,0,sizeof(used)); tLevel=-1; dfs(i,1); if(tLevel>maxLevel){ maxLevel=tLevel; needRoot.clear(); needRoot.push_back(i); } else if(tLevel==maxLevel) needRoot.push_back(i); } for(vector<int>::iterator ite=needRoot.begin();ite!=needRoot.end();++ite) printf("%d\n",*ite); } int main() { scanf("%d",&n); for(int i=1;i<n;i++){ int u,v; scanf("%d%d",&u,&v); edge[u].push_back(v); edge[v].push_back(u); } int connectedCnt=countTrees(); if(connectedCnt>1) printf("Error: %d components\n",connectedCnt); else computeDeepestRoot(); return 0; }