PAT1021. Deepest Root (25)
之前不知道怎么判断是不是树,参考了
http://blog.csdn.net/eli850934234/article/details/8926263
但是最后有一个测试点有超时,在bfs里我用了数组拷贝,所以简化成直接访问超时就没有了。
#include <iostream> #include <vector> #include <queue> #include <cstring> using namespace std; int bing[10005]; int n; int bfs(int node); vector<int> nodeList[10005]; vector<int> maxDis; int vis[10005]; int unionFind(int a){ if(bing[a]==0) return a; else return unionFind(bing[a]); } void unionUnion(int a,int b){ int ia=unionFind(a); int ib=unionFind(b); if(ia!=ib) bing[ia]=ib; } int bfs(int node){ memset(vis,0,sizeof(vis)); queue<int> q; q.push(node); int co=1; int co2=0; int depth=0; while(!q.empty()){ int fro=q.front(); vis[fro]=1; q.pop(); for(int k=0;k<nodeList[fro].size();k++){ if(vis[nodeList[fro][k]]==0){ q.push(nodeList[fro][k]); co2++; } } co--; if(co==0) { co=co2; co2=0; depth++; } } return depth; } int main(){ cin>>n; int i,j; for(int m=0;m<n-1;m++){ cin>>i>>j; unionUnion(i,j); nodeList[i].push_back(j); nodeList[j].push_back(i); } int count=0; for(int m=1;m<=n;m++){ if(bing[m]==0) count++; } if(count!=1){ printf("Error: %d components",count); return 0; } int max=0; for(int m=1;m<=n;m++){ int dis=bfs(m); if(max<dis){ maxDis.clear(); max=dis; maxDis.push_back(m); }else if(max==dis){ maxDis.push_back(m); } } for(int m=0;m<(maxDis.size());m++){ cout<<maxDis[m]<<endl; } return 0; }