提问者:小点点

用于自动循环填充矩阵


我想把邻接表转换成邻接矩阵

邻接列表如下:

vector< vector< Arc * > * > _adjacences;

arc类有这些:

public:
    int sommetArrive; // tops
    int longueur; // distance

我有如下3个向量要填充:

std::vector <int> list[_adjacences.size()]; // vector of tops
std::vector <int> >listD[_adjacences.size()]; // vector of distances
std::vector < vector <int> > matrix( _adjacences.size(), 
         vector<int>(_adjacences.size(),0 )); // matrix init to 0 and to be filled to become adjacenecy matrix

我这样填充向量:

for (unsigned i = 0; i < _adjacences.size(); i++){
    for (auto j : *_adjacences[i]){
         list[i].push_back(j->sommetArrive);
         listD[i].push_back(j->longueur);
    }
}

现在我的问题来了:我试着做邻接矩阵,我能做

0 0 0 0 1 0 1 
0 1 0 1 0 1 0
....

通过这样做:

for (unsigned i = 0; i < _adjacences.size(); i++) {
    for (auto j : list[i]){
          matrix[i][j] = 1;
    }
}

我想用顶部之间的距离来做邻接矩阵,而不是1。

我试着这样做:

for (unsigned i = 0; i < _adjacences.size(); i++) {
    for (auto j : list[i]){
         for (auto k : listD[i]){ // MY ERROR IS SOMEWHERE HERE 
              matrix[i][j] = k;   // IN THIS LOOP
         }
     }
}

我在同一排中以相同的距离结束

0  0  0  0  35  0  35
0 22  0  22  0  22 0

我该如何修复我的循环?


共1个答案

匿名用户

所以我认为listlistd是一个错误,因为您将应该保持在一起的信息分开了。 相反,您应该直接从_邻接构造矩阵。 像这样

vector< vector< Arc * > * > _adjacences = ...;

std::vector<vector<int>> matrix(_adjacences.size(), vector<int>(_adjacences.size()));
for (unsigned i = 0; i < _adjacences.size(); i++) {
    for (auto j : *_adjacences[i]) {
         matrix[i][j->sommetArrive] = j->longueur;
    }
}

如果您想要listlistd以及matrix,那么您可以用与现在相同的方式填充它们。