C++ 如何反转邻接列表?

C++ 如何反转邻接列表?,c++,algorithm,graph,adjacency-list,C++,Algorithm,Graph,Adjacency List,假设我的邻接列表如下: 0 : 1 1 : 0 其反面应为空,因为初始列表中有两个圆弧: 0: 1: 或 变成 0 : 1 : 0 0 : 1 1 : 0 0 : 2, 3 1 : 2, 3 2 : 3 : 0, 1, 2, 4 4 : 0, 2 另一个例子: 0 : 1 : 变成 0 : 1 : 0 0 : 1 1 : 0 0 : 2, 3 1 : 2, 3 2 : 3 : 0, 1, 2, 4 4 : 0, 2 最后一个例子 0 : 1, 4 1 : 0, 4

假设我的邻接列表如下:

0 : 1
1 : 0
其反面应为空,因为初始列表中有两个圆弧:

0:
1:

变成

0 : 
1 : 0
0 : 1
1 : 0
0 : 2, 3
1 : 2, 3
2 : 
3 : 0, 1, 2, 4
4 : 0, 2
另一个例子:

0 : 
1 : 
变成

0 : 
1 : 0
0 : 1
1 : 0
0 : 2, 3
1 : 2, 3
2 : 
3 : 0, 1, 2, 4
4 : 0, 2
最后一个例子

0 : 1, 4
1 : 0, 4
2 : 0, 1, 3, 4
3 : 
4 : 3, 1
变成

0 : 
1 : 0
0 : 1
1 : 0
0 : 2, 3
1 : 2, 3
2 : 
3 : 0, 1, 2, 4
4 : 0, 2
有没有一个算法可以做到这一点

Graphe *Graphe::grapheInverse( void ){
    Graphe *r = new Graphe (_adjacences.size() );
    for (unsigned i = 0; i < _adjacences.size(); i++)
        for ( unsigned j = 0; j < _adjacences[i]->size(); j++ )
            if ( (*_adjacences[i])[j] == 1 ) // or 0 or 2 or 3 or 4 or ... like last example
                //r->addArcs( i, (*_adjacences[i])[j] ); //adds an arc from A to B
            
    return r;
}
graph*graph::graphereverse(void){
graph*r=新的graph(_adjances.size());
for(无符号i=0;i<_adjances.size();i++)
对于(无符号j=0;j<_邻接[i]>size();j++)
如果(*_邻接[i])[j]==1)//或0或2或3或4或…如上一个示例
//r->addArcs(i,(*_邻接[i])[j]);//将一条弧从A添加到B
返回r;
}

只需反转邻接矩阵即可


如果有0,请将其替换为1,反之亦然。只排除对角线,始终在那里放一个0。

这与什么不同?这一个有更多的示例,需要阅读的代码更少。您没有清楚地说明反转图形的意思。这肯定不符合。从示例中可以看出,您希望所有可能的圆弧不出现在原始图形中,并且排除自指向“循环”圆弧。@RalfKleberhoff yes初始图形中可用的圆弧将被删除,不可用的圆弧将在反向图形中可用