这题一开始没认真看题,直接看样例以为求叶子结点和几棵树。题目的真正的意思是给你一张无环连通图,以任意点为根节点可以把该图看成一棵树,并且如果当前树的深度最大,就称这个点是Deepest Root,也就是题目所要求的(升序输出)。如果这个图有多个连通分量,求连通分量的个数。DFS可以通吃,详见代码~
#include <bits/stdc++.h> #define maxn 100005 #define INF 0x3f3f3f3f using namespace std; typedef long long ll; int n,u,v,p,cnt,maxx,tmax; vector<int> ve[maxn],ans; int vis[maxn]; void DFS(int x,int d) { tmax=max(tmax,d); for(int i=0;i<ve[x].size();i++) { if(!vis[ve[x][i]]) { vis[ve[x][i]]=1; DFS(ve[x][i],d+1); } } } void dfs(int x) { if(ve[x].size()==0) return; for(int i=0;i<ve[x].size();i++) { if(!vis[ve[x][i]]) { vis[ve[x][i]]=1; dfs(ve[x][i]); } } } int main() { memset(vis,0,sizeof(vis)); scanf("%d",&n); for(int i=0;i<n-1;i++) { scanf("%d%d",&u,&v); ve[u].push_back(v); ve[v].push_back(u); } cnt=0; for(int i=1;i<=n;i++) { if(!vis[i]) { dfs(i); cnt++; } } if(cnt!=1) { printf("Error: %d components\n",cnt); return 0; } maxx=0; for(int i=1;i<=n;i++) { memset(vis,0,sizeof(vis)); tmax=0; vis[i]=1; DFS(i,0); if(tmax>maxx) { maxx=tmax; ans.clear(); ans.push_back(i); } else if(tmax==maxx) ans.push_back(i); } sort(ans.begin(),ans.end()); for(int i=0;i<ans.size();i++) printf("%d\n",ans[i]); return 0; }
原文地址:https://www.cnblogs.com/FTA-Macro/p/10588981.html
时间: 2024-10-12 09:02:18