一开始就是觉得用DFS想不通为什么网上是说两遍DFS/BFS找出当前最大边(树的最大直径)
后来发现纯DFS时间代价太大了O(n²)
附上纯DFS代码
#include <stdio.h>
#include <string.h>
int n,visited[1000],Point[1000]={0};
int dist[1000][1000]={0};
void end()
{
for(int i=0;i<n;i++)
{
int sum=0;
for(int j=0;j<n;j++)
{
if(dist[i][j]>0)sum++;
}
if(sum==1)//只有一条边的是叶子
Point[i]=1;
}
}
int l=0,ans=0;
void dfs(int i,int step)
{
if(Point[i]==1 && step!=0)//判断这个点是不是叶子节点且不是起点
{
printf("i=%d l=%d\n",i,l);
if(l>ans)
ans=l;
return ;
}
for(int j=0;j<n;j++)
{
if(visited[j]==0&&dist[i][j]>0)
{
l+=dist[i][j];
visited[j]=1;
dfs(j,step+1);
l-=dist[i][j];
visited[j]=0;
}
}
}
int main()
{
scanf("%d",&n);
int a,b,c;
for(int i=0;i<n-1;i++)
{
scanf("%d %d %d",&a,&b,&c);
dist[a-1][b-1]=c;
dist[b-1][a-1]=c;
}
end();//找叶子节点
for(int i=0;i<n;i++)
{
memset(visited,0,sizeof(visited));
visited[i]=1;
dfs(i,0);
}
printf("%d\n",ans);
return 0;
}
看了网上的代码后的修改
后续附上