int distant[maxn];//记录到1的距离,-1表示还没遍历到
vector<int> g[maxn];
void dfs(int st, int dis, int *total){
    int i;
    for(i = 0; i < g[st].size(); ++i){
        int child = g[st][i];
        if(distant[child] == -1){   
            distant[child] = dis+1;
            *total += 2;
            dfs(child, dis+1, *total);
        }
    }
}
int main(){
/*
        io
*/
    memset(distant, -1, sizeof(distant));
    int total = 0; //总共的路径,表示从1开始转一圈回来的长度
    distant[1] = 0;
    dfs(1,0,&total);
    int i, maxd = -1;
    for(i = 1; i <= n; ++i)
        if(maxd < distant[i]) maxd = distant[i];
   printf("%d\n", total - maxd);    
}
我的伪代码大概就是这样,思路还是很简单的