我有一个向量A [9 3 6 9 3 6]
,每2个元素代表一个图的边缘,我想从这个向量创建邻接矩阵。
首先,我创建了唯一的向量A [3 6 9]
以了解矩阵的大小
其次我创建一个矩阵并用0
填充它第三,我将在A上运行循环以了解连接的边缘,我的问题是如何告诉C ++ A中的第一个元素实际上代表我的矩阵中的元素0,同样代表6代表1和9表示为3,这样当我构造我的邻接矩阵时,我知道0 1 2实际上代表3 6 9,我听说过使用地图但不知道如何在我的程序中构造它,因为我是C ++的新手。
答案 0 :(得分:0)
您实际上是在尝试跟踪顶点的标签。如果每个顶点都有一个顺序分配的数字,您可以扫描新的顶点标签并在地图中插入相应的序列号,如下所示:
std::map<int, std::size_t> labels; // "int" is the label type; could be anything!
std::size_t store_vertex_label(int v)
{
std::map<int, std::size_t>::const_iterator const it = labels.find(v);
if (it != labels.end()) return it->second;
const std::size_t new_number = labels.size();
labels.insert(std::make_pair(v, new_number);
return new_number;
}
现在,当您处理输入时,您一次只读取一个标签标记v
,将其发送到store_vertex_label()
,然后返回相应的顺序顶点索引。
您的邻接矩阵的大小为labels.size()
平方。
请注意,您的标签类型不必是整数,也可以是任何内容(例如字符串)。
答案 1 :(得分:0)
有几种方法:
首先是最糟糕的解决方案。如果vector未排序,请使用3rd。如果要降低空间复杂度,请使用2nd。如果使用大尺寸和散列图,第3个也会很好。