1021. Deepest Root (25)

来源:互联网 发布:神经网络 凸优化问题 编辑:程序博客网 时间:2024/06/05 01:13

刚开始题目没看清

n个节点有n-1条边,那么可以肯定当所有节点连成一个树时必无环

因此DFS得连通子图为一个时就是表明此时数无环,可以直接BFS求最大深度

用DFS得到连通子图个数(子图有环无环不要紧,能遍历就行)


第三个测试点用时885ms有点多

我的方法简单易懂

算法笔记是给出了利用一条BFS的头尾两个节点,分别对这两个节点BFS得到两个集合,取交集即为所求最大深度点集;

此外求连通子图算法笔记上用的并查集,暂时不会操作并查集。

#include<iostream>#include<vector>#include<queue>#include<algorithm>using namespace std;const int MAX = 10010;vector<int> child[MAX];//邻接表int visited[MAX],deep[MAX],deepmax[MAX]; int n;int BFS(int s){fill(visited,visited+MAX,0);fill(deep,deep+MAX,0);int dmax=1;queue<int> q;q.push(s);deep[s]=1;visited[s]=1;while(!q.empty()){int p=q.front();q.pop();for(int i=0;i<child[p].size();i++){if(visited[*(child[p].begin()+i)]==0){visited[*(child[p].begin()+i)]=1;q.push(*(child[p].begin()+i));deep[*(child[p].begin()+i)]=deep[p]+1;dmax=deep[p]+1; }}}return dmax;}void DFS(int s){visited[s]=1;for(int i=0;i<child[s].size();i++){if(visited[*(child[s].begin()+i)]==0){DFS(*(child[s].begin()+i));}}}int part(){//求连通子图个数 fill(visited,visited+MAX,0);int count=0;for(int i=1;i<=n;i++){if(visited[i]==0){count++;DFS(i);}}return count; }int main(){cin>>n;for(int i=0;i<n-1;i++){int st,ed;cin>>st;cin>>ed;child[st].push_back(ed);child[ed].push_back(st);}if(part()!=1){printf("Error: %d components\n",part());}else{int levelmax=0;for(int i=1;i<=n;i++){deepmax[i]=BFS(i);if(levelmax<deepmax[i]){levelmax=deepmax[i];}}for(int i=1;i<=n;i++){if(deepmax[i]==levelmax){printf("%d\n",i);}}}return 0;}


0 0
原创粉丝点击