【发布时间】:2020-08-10 21:42:55
【问题描述】:
我问自己我的代码有什么问题来查找树的直径:
(通过树的直径,我的意思是该树图中两个节点之间的最大距离)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
#define MAXN 1000005
int n,a,b;
int dist[MAXN];
vector<int> adj[MAXN];
vector<int> ways;
void dfs(int U, int father){
if(father==U){
dist[U]=1;
}
else{
dist[U]=1+dist[father];
}
for(int i=0;i<(int)adj[U].size();i++){
int V=adj[U][i];
if(dist[V]==-1) dfs(V,U);
}
}
void solve(int S){
dist[S]=0;
for(int j=0;j<(int)adj[S].size();j++){
int w=adj[S][j];
dfs(w,w);
int maxdist=0;
for(int i=1;i<=n;i++){
if(dist[i]!=-1){
maxdist=max(maxdist,dist[i]);
dist[i]=0;
}
}
ways.push_back(-maxdist);
}
}
int main(){
cin>>n;
if(n==2) cout<<"1\n";
else{
for(int i=1;i<=n;i++){
dist[i]=-1;
}
for(int i=1;i<n;i++){
cin>>a>>b;
adj[a].push_back(b);
adj[b].push_back(a);
}
int vert;
for(int i=1;i<=n;i++){
if((int)adj[i].size()>1){
vert=i;
break;
}
}
solve(vert);
sort(ways.begin(),ways.end());
int ret=-(ways[0]+ways[1]);
cout<<ret<<"\n";
}
return 0;
}
对我来说,这听起来合乎逻辑且非常程序化,但我将其提交给在线法官并没有被接受。怎么回事?
【问题讨论】:
-
如果
n足够大并且树的形状正确,dfs可以将堆栈顶部从堆栈中炸开。 -
测试有哪些限制?
-
n 被限制为小于或等于 10^6 且大于或等于 2。时间限制为 5 秒,根据我的经验,这些限制很多
-
首先你的输入法不保证一棵树。它也可能是带有循环链接的图。如果给出了这一点,那么您的方法不会处理具有单个子节点的树。您正在使用
ways[0] + ways[1],但可能没有第二种方式,所以 UB。