【数据结构笔记】5:图的邻接表结构下求无向图的连通分量

来源:互联网 发布:c语言输出一个整数 编辑:程序博客网 时间:2024/06/14 05:21

对于图的邻接表存储结构,有以下数据成员:

int vexNum, vexMaxNum, arcNum;// 顶点数目、允许的顶点最大数目和边数AdjListNetWorkVex<ElemType, WeightType> *vexTable;// 顶点表mutable Status *tag;        // 标志数组WeightType infinity;// 无穷大的值

其中顶点节点的数据成员:

ElemType data;// 数据元素值AdjListNetworkArc<WeightType> *firstarc;// 指向邻接链表边结点的指针

其中边节点的数据成员:

int adjVex;// 弧头顶点序号WeightType weight;// 边的权值AdjListNetworkArc<WeightType> *nextarc; // 下一条边结点的指针

要实现求无向图的连通分量,可以按顶点节点数组顺序,从每个未被访问的节点开始DFS,搜索过的节点设为已经访问过的,每次执行DFS都对计数器w+1即可。

 

 

下面增加这两个函数作为邻接表类的public方法。

*邻接表的DFS

template <class ElemType, class WeightType>void AdjListDirNetwork<ElemType, WeightType>::DFS(int v){if(GetTag(v)==UNVISITED)//如果它没有访问过{SetTag(v, VISITED);//访问一下AdjListNetworkArc<WeightType> *p;p = vexTable[v].firstarc;//p从v的第一个相邻节点开始while(p!=NULL){if(GetTag(p->adjVex)==UNVISITED)//如果这个相邻节点没访问过DFS(p->adjVex);//DFS它p=p->nextarc;}}}

*获取连通分量(传给引用w)

template <class ElemType, class WeightType>void AdjListDirNetwork<ElemType, WeightType>::GetFenLiang(int &w){w=0;//初始化计数器//初始化全图for(int v=0;v<vexNum;v++)SetTag(v, UNVISITED);//全都变为没访问过的for(int v=0;v<vexNum;v++)//对于每个顶点{if(GetTag(v)==UNVISITED)//如果没访问过{DFS(v);//DFS之,结束后其整个连通图的节点都将变为VISITEDw++;//如果执行到这里,说明进行了一次必要的DFS,子图显然要+1}}}

加油。
0 0
原创粉丝点击