寻找两个叶子结点最近的距离为多少
#include <cstdio>
#include <cstring>
#define INF 20000000
int cnt;
int head[10010],next[20010][3],dp[10010][2];
void add(int u,int v,int w)
{
next[cnt][1]=v;
next[cnt][2]=w;
next[cnt][0]=head[u];
head[u]=cnt++;
}
int min(int x,int y)
{
return x>y?y:x;
}
void trajan(int cur,int fa)
{
int flag=0;
for(int i=head[cur];i!=-1;i=next[i][0])
{
int v=next[i][1];
if(v!=fa)
{
++flag;
trajan(v,cur);
int sum=next[i][2]+dp[v][0];
if(sum<dp[cur][0])
{
dp[cur][1]=dp[cur][0];
dp[cur][0]=sum;
}
else if(dp[cur][1]>sum) dp[cur][1]=sum;
}
}
if(!flag) dp[cur][0]=0;
if(fa==-1&&flag==1) cnt=min(cnt,dp[cur][0]);
cnt=min(cnt,dp[cur][0]+dp[cur][1]);
}
int main()
{
// freopen("in.txt","r",stdin);
int n;
while(scanf("%d",&n)!=EOF)
{
if(!n) break;
for(int i=0;i<=n;++i) head[i]=-1,dp[i][0]=dp[i][1]=INF;
int u,v,w;
cnt=0;
for(int i=0; i<n-1; ++i)
{
scanf("%d%d%d",&u,&v,&w);
add(u-1,v-1,w);
add(v-1,u-1,w);
}
cnt=INF;
trajan(0,-1);
printf("%d\n",cnt);
}
return 0;
}