首页 > 解决方案 > 在 c++ 中使用四个值 a、b、c、d 生成边图

问题描述

我在解决一个问题时遇到了麻烦,该问题要求我使用 4 个随机数 a,b,c,d 生成边缘图,因此公式如下,要生成图的节点,我们将使用变量 d ,如果我们将 d 除以 3,余数为 0,则生成 10 个节点,如果 d/3 = 1,则生成 11 个节点,如果 d/3 = 2,则生成 12 个节点,对于边缘,我们有以下公式( i,j) ∈ U <-> ((ai+bj)/c) / d ≤ 1 ,如果公式除以 d 后的余数小于或等于,则基本上边将连接 i 的节点和 j 的节点1.有人可以告诉我下面的代码有什么问题吗?

这是代码:

#include <iostream>
#include <vector>
using namespace std;
struct Edge {
    int src, dest;
};
class Graph
{
public:
    vector<vector<int>> adjList;
    Graph(vector<Edge> const& edges, int N)
    {
        adjList.resize(N);
        for (auto& edge : edges)
        {
            adjList[edge.src].push_back(edge.dest);
        }
    }
};
void printGraph(Graph const& graph, int N)
{
    for (int i = 0; i < N; i++)
    {
        cout << i << " ——&gt; ";
        for (int v : graph.adjList[i])
        {
            cout << v << " ";
        }
        cout << endl;
    }
}
int main()
{
    vector<Edge> edges;
    int a, b, c, d,remainder,Nodges,result;
    cout << "Enter 4 values : \n";
    cin >> a >> b >> c >> d;
    remainder = d % 3;
    if (remainder == 0)
    {
        Nodges = 10;
    }
    else if (remainder == 1)
    {
        Nodges = 11;
    }
    else if (remainder == 2)
    {
        Nodges = 12;
    }
    for (int i = 0; i < Nodges; i++)
    {
        for (int j = 0; j < Nodges; j++)
        {
            result = ((a * i + b * j) / c) % d;
            if (result <= 1)
            {
                edges =
                {
                    {i,j}
                };
            }
        }
    }
    Graph graph(edges, Nodges);
    printGraph(graph, Nodges);
    return 0;
}

标签: c++

解决方案


起初,您不会处理d超出所需范围的情况。如果d是例如 37,那么您将Nodges保持未初始化状态,然后通过读取它来调用未定义的行为。您可能会添加一个 finalelse来捕获这种情况,为空图或消息打印一些表示,然后返回,这样您根本不会遇到 for 循环。

不过更简单:

if(remainder < 3)
{
    nodes = 10 + remainder;

    // your for loops here
}

如果你想创建一个空图,那么不要忘记初始化nodes0; 否则,您也应该在if上面的块中包含图形代码。

但是,您的代码失败的要点如下:

edges =
{
    {i,j}
};

这样,您一次又一次地创建一个新向量,始终包含一个元素,而旧的向量将被替换。

你实际上需要:

edges.emplace_back(i, j);

最后:习惯于在输入操作后始终检查流的状态。用户往往会提供无效的输入,如果您没有发现您可能会遇到意外且实际上未定义的行为(例如除以 0)。

if(std::cin >> a >> b >> c >> d)
{
    /* your code */
}
else
{
    // handle invalid input, e. g. by printing some message

    // if you want to go on reading the stream:
    // clears the error flags:
    std::cin.clear();
    // clears the stream's buffer yet containing the invalid input:
    std::cin.ignore(numeric_limits<streamsize>::max(), '\n');
}

推荐阅读