c++ - 在 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 << " ——> ";
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;
}
解决方案
起初,您不会处理d
超出所需范围的情况。如果d
是例如 37,那么您将Nodges
保持未初始化状态,然后通过读取它来调用未定义的行为。您可能会添加一个 finalelse
来捕获这种情况,为空图或消息打印一些表示,然后返回,这样您根本不会遇到 for 循环。
不过更简单:
if(remainder < 3)
{
nodes = 10 + remainder;
// your for loops here
}
如果你想创建一个空图,那么不要忘记初始化nodes
为0
; 否则,您也应该在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');
}
推荐阅读
- angular - Object(...) 不是函数 - 在 Module../node_modules/@angular/material/esm5/core.es5.js
- graphql - 解析作为 Apollo 客户端中缓存查询超集的查询
- sql - 使用 R 库 RODBC 获取以数字开头的数据库
- java - 为什么 maven 从命令行执行配置文件时出错
- java - Intellij IDE 在 gradle 项目中看不到生成的类
- java - 如何在我的 java webapp 中使用 api 与另一个 webapp 通信?
- amazon-web-services - AWS CloudFormation - 资源未能创建错误
- java - java中数字的正则表达式
- javascript - 如何生成批量二维码
- javascript - 取消注释 jquery 如何导致 Rails 服务器工作?