问答题
在有关图的算法中常用到两个图的操作:
int getFirstNeighbor (Graph G,int v); //取顶点v的第一个邻接顶点
int getNextNeighbor(Graph G,int v,int w); //取邻接顶点w的下一邻接顶点
试分别给出在邻接矩阵和邻接表为存储结构的情形下它们的实现。
【正确答案】
【答案解析】(1)用邻接矩阵做存储结构的场合。
为了找到顶点v的第一个临界顶点,顺序地检测邻接矩阵的第v行,最先遇到的非零元素(带权图情形是小于maxValue的元素)就是顶点v的第一个邻接顶点。从这个矩阵元素继续向后找,就可以以类似的判断找到下一个邻接顶点。
int getFirstNeighbor(Graphmtx&G,int v){
//给出顶点v的第一个邻接顶点,如果找不到,则函数返回-1。
if(v!=-1){
for(int col=0;col<G.numvertices;col++)
if(G.Edge[v][col]>0&&G.Edge[v][col]<maxValue)return col;
}
return-1;
}
int getNextNeighbor(Graphmtx &G,int v,int w){
//给出顶点v的某邻接顶点w的下一个邻接顶点
if(v!=-1&&w!=-1){
for(int col=w+1;col<G.numVertices;col++)
if(G.Edge[v][col]>0&&G.Edge[V][col]<maxWeight)return col;
}
return-1;
}
(2)用邻接表作存储结构的场合。
为了找到顶点v的第一个邻接顶点,检测邻接表第v个边链表,如果链表非空,第一个边结点中dest域存放的顶点(号)就是顶点v的第一个邻接顶点。在此链表中该边结点的下一个边结点就是下一个邻接顶点。
int getFirstNeighbor(Graphlnk&G,int v){
//给出顶点v的第一个邻接顶点,如果找不到,则函数返回-1。
if(v!=-1){ //顶点v存在
Edge
*
p=G.NodeTable[v].adj; //对应边链表第一个边结点
if(p!=NULL)return p->dest; //存在,返回第一个邻接顶点
}
Return-1; //第一个邻接顶点不存在
}
int getNextNeighbor(Graphlnk&G,int v,int w) {
//给出顶点v的邻接顶点W的下一个邻接顶点,如果找不到,则函数返回-1。
if(v!=-1){ //顶点v存在
Edge
*
p=G.NodeTable[v].adj; //对应边链表第一个边结点
while (p!=NULL&&p->dest!=w)p=p->link; //寻找邻接顶点w
if (p!=NULL&&p->link!=NULL)return p->link->dest;
//返回下一个邻接顶点
}
return-1; //下一邻接顶点不存在
}