在下图中查找节点之间的最短距离

时间:2015-01-20 18:07:18

标签: c++ graph

图如此定义,该图具有N个节点,其中每个节点被分配数字1 <= k <= N(每个数字仅被分配给一个节点)。如果i最大可归ji!= j),则节点ij之间存在边。给定两个节点,我需要找到它们之间的最短路径。

我认为这是一个简单的问题。我认为我需要做的只是将两个数字替换为最大可分,直到它们相等,然后简单地打印出我用可分割的数字替换数字的次数。但是我没有通过所有测试(但是我的代码通过了示例测试)。

以下是我使用的代码:

#include <stdio.h>
#include <iostream>
#include <math.h>  

using namespace std;

int biggest_divisor (int number) {
    for (int i = 2; i <= ceil (sqrt(number)) + 1; i++){
        if (number% i == 0){
            return number/ i;
        }
    }
    return 1;
}

int main(int argc, char **argv)
{

    int N, a, b;
    int a_steps = 0;
    int b_steps = 0;

    cin >> N >> a >> b;

    while (a != b){
        if (a > b){
            a = biggest_divisor (a);
            a_steps += 1;
        } 
        if (a < b) {
            b = biggest_divisor (b);
            b_steps += 1;
        }
    }
    cout << a_steps + b_steps;
}

1 个答案:

答案 0 :(得分:1)

完整解决方案:

int biggest_divisor (int number) {
    for (int i = number / 2 ; i >= 1; i--){
        if (number% i == 0){
            return i;
        }
    }
    return 1;
}

int main(int argc, char* argv[])
{
    int N, a, b;
    int steps = 0;

    cin >> N >> a >> b;

    while (a != b) {
        (a > b) ? a = biggest_divisor (a) : b = biggest_divisor (b);
        steps++;
    }
    cout << steps;
}