补充: 我的意思是原本无权图DensGraph中,如果a和b相连,直接就return了,如下:
1 2 3 4 5 6 | void addEdge( int v, int w ) { if ( hasEdge( v, w ) ) return ; //... } |
而在这个基础上修改成有权图的时候,为什么不继续保持当v和w之间有边就直接返回,而是要先删除原来的边,然后再重新连上一条边:
1 2 3 4 5 6 7 8 9 | void addEdge( int v, int w, Weight weight ) { if ( hasEdge( v, w ) ) delete g[v][w]; if ( !directed ) delete g[w][v]; m--; //... } |
我在自己写的时候,在Edge.h里面加入了一个change函数来修改边的权值。所以如果两个顶点之间已经有边的话,就替换成新的权值。如下
1 2 3 4 5 6 7 8 9 10 11 | void addEdge( int v, int w, Weight weight ) { if ( hasEdge( v, w ) ) { g[v][w]->change( weight ); if ( !directed ) delete g[w][v]->change( weight ); return ; } //... } |
最后,那个没有带模板参数的代码是在视频中的。
补充:那个先删除边的是在您课程的邻接矩阵里的。邻接表没有。这个不能回复真麻烦- -!