A1021 Deepest Root (25) 图的遍历DFS******

    技术2023-04-07  92

    注意,在考虑选节点使树最高的时候,采用的是先随便选取一个节点,这个节点到各叶子节点最高的设为集合a,集合a中任意一节点再次遍历,找到的使树最高的叶子节点结合b。ab并集为所求节点集合。首先必须明确,所有节点都是双向可访问的,当考虑到是非图时,必须保证是单向进行的,所以必须设置vis的数组,每次DFS之后,必须采用memset,将vis设置为false值。

    #include<cstdio> #include<iostream> #include<vector> #include<cstring> #include<algorithm> using namespace std; const int maxn=10100; vector<int> G[maxn],ans,temp; bool vis[maxn]={false}; int maxdepth=0; void DFS(int index,int depth ) { if(depth>maxdepth) { temp.clear(); temp.push_back(index); maxdepth=depth; } else if(depth==maxdepth) { temp.push_back(index); } vis[index]=true; for(int i=0;i<G[index].size();i++) { if(vis[G[index][i]]==true) continue; DFS(G[index][i],depth+1); } } int main() { int n,a,b,num=0; cin>>n; for(int i=0;i<n-1;i++) { scanf("%d%d",&a,&b); G[a].push_back(b); G[b].push_back(a); } for(int i=1;i<=n;i++) { if(vis[i]==false) { DFS(i,1); num++; } } if(num!=1) printf("Error: %d components",num); else { ans=temp; temp.clear(); memset(vis,false,n+1); DFS(ans[0],1); for(int i=0;i<temp.size();i++) { ans.push_back(temp[i]); } sort(ans.begin(),ans.end()); printf("%d\n",ans[0]); for(int i=1;i<ans.size();i++) { if(ans[i]!=ans[i-1]) printf("%d\n",ans[i]); } } }
    Processed: 0.008, SQL: 9