问题是我需要创建一个随机无向图来测试Dijkstra 算法的基准,使用数组和堆来存储顶点。AFAIK 在稀疏图和平均图上运行时,堆实现应该比数组快,但是在密集图上,堆的效率应该比数组低。
我尝试编写代码,该代码将根据输入生成图形 - 顶点数和边总数(无向图中的最大边数为 n(n-1)/2)。
在入口处,我将边的总数除以顶点的数量,这样每个顶点都有一个 const 的边数。该图由邻接表表示。这是我想出的:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <list>
#include <set>
#define MAX 1000
#define MIN 1
class Vertex
{
public:
int Number;
int Distance;
Vertex(void);
Vertex(int, int);
~Vertex(void);
};
Vertex::Vertex(void)
{
Number = 0;
Distance = 0;
}
Vertex::Vertex(int C, int D)
{
Number = C;
Distance = D;
}
Vertex::~Vertex(void)
{
}
int main()
{
int VertexNumber, EdgeNumber;
while(scanf("%d %d", &VertexNumber, &EdgeNumber) > 0)
{
int EdgesFromVertex = (EdgeNumber/VertexNumber);
std::list<Vertex>* Graph = new std::list<Vertex> [VertexNumber];
srand(time(NULL));
int Distance, Neighbour;
bool Exist, First;
std::set<std::pair<int, int>> Added;
for(int i = 0; i < VertexNumber; i++)
{
for(int j = 0; j < EdgesFromVertex; j++)
{
First = true;
Exist = true;
while(First || Exist)
{
Neighbour = rand() % (VertexNumber - 1) + 0;
if(!Added.count(std::pair<int, int>(i, Neighbour)))
{
Added.insert(std::pair<int, int>(i, Neighbour));
Exist = false;
}
First = false;
}
}
First = true;
std::set<std::pair<int, int>>::iterator next = Added.begin();
for(std::set<std::pair<int, int>>::iterator it = Added.begin(); it != Added.end();)
{
if(!First)
Added.erase(next);
Distance = rand() % MAX + MIN;
Graph[it->first].push_back(Vertex(it->second, Distance));
Graph[it->second].push_back(Vertex(it->first, Distance));
std::set<std::pair<int, int>>::iterator next = it;
First = false;
}
}
// Dijkstra's implementation
}
return 0;
}
我收到一个错误:
尝试从集合数据创建图形时,设置迭代器不可取消引用”。
我知道它与动态擦除集合元素有关,但是我需要尽快擦除它们以减少内存使用。
也许有更好的方法来创建一些无向图?我的很原始,但这是我想出的最好的。我正在考虑制作一个更容易的有向图,但它不能确保每两个顶点都会连接。
我将不胜感激任何提示和解决方案!