1021 Deepest Root [DFS]
Posted fta-macro
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1021 Deepest Root [DFS]相关的知识,希望对你有一定的参考价值。
这题一开始没认真看题,直接看样例以为求叶子结点和几棵树。题目的真正的意思是给你一张无环连通图,以任意点为根节点可以把该图看成一棵树,并且如果当前树的深度最大,就称这个点是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 ",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 ",ans[i]); return 0; }
以上是关于1021 Deepest Root [DFS]的主要内容,如果未能解决你的问题,请参考以下文章
1021 Deepest Root (25 分) 难度: 中 / 知识点: 树的直径 连通块
1021 Deepest Root (25分) 从测试点3超时到满分再到代码优化