题目叙述
有n个村庄从1到n命名,共有n-1条边,要求从1开始遍历完所有村庄,求遍历完的最小路径长度多少(具体题目记不清了)
输入
4
1 2
1 3
3 4
输出
4
题解
其实很简单,除了从1出发的关键路径上的边只遍历一遍,其他边都要遍历两边,因此只需要求出从1出发到叶子节点的最长路径,用(总边数-最长路径)x2+最长路径就是输出的结果。
#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
struct Edge
{
int next;
int to;
int w;
}edges[100001];
int n,head[100001],mins,Hash[10001],maxs=1;
void DFS(int start,int step)
{
if(maxs<step)
{
maxs=step;
return ;
}
for(int i=head[start];i!=-1;i=edges[i].next)
{
if(!Hash[edges[i].to])
{
Hash[edges[i].to]=1;
DFS(edges[i].to,step+1);
Hash[edges[i].to]=0;
}
}
return ;
}
int main()
{
cin>>n;
int cnt=0;
maxs=1;
memset(head,-1,sizeof(head));
memset(Hash,0,sizeof(Hash));
for(int i=0;i<n-1;i++)
{
int a,b;
cin>>a>>b;
edges[cnt].next=head[a];
edges[cnt].to=b;
head[a]=cnt++;
edges[cnt].next=head[b];
edges[cnt].to=a;
head[b]=cnt++;
}
Hash[1]=1;
DFS(1,0);
//cout<<maxs<<endl;
cout<<2*n-2-maxs<<endl;
}