数据结构——图 连通图与连通分量

时间:2021-04-16 11:36:59

note: 连通是无向图中的概念

接下来介绍两个算法:判断图的连通性与标记连通分量。

1. 判断一个图是否连通. Determine whether an undirected graph is connected


class Undirected : virtual public Network {
public:
bool Connected();
};

bool Undirected::Connect()
{// Return true iff graph is connected.

int n = Vertices();

// set all vertices as not reached
int *reach = new int [n+1];
for (int i = 1; i <= n; i++)
reach[i] = 0;

//mark vertices reachable from vertex 1
DFS(1, reach, 1);

//check if all vertices marked
for (int i = 1; i<= n; i++)
if (!reach[i]) return false;
return true;
}

2.Component labeling. 标记连通分量

下面这个程序的复杂性是O(n^2); 用邻接链表描述图时,是O(n+e)

int Undirected::LabelComponents(int L[])
{// Label the components of the graph.
//Return the number of components and set L[1:n] to represent a labeling of vertices by component.

int n = Vertices();

// assign all vertices to no component
for (int i = 1; i<=n; i++)
L[i] = 0;

int label = 0; // ID of last component
// identify components
for (int i = 1; i <= n; i++)
{
if(!L[i]){// unreached vertex
//vertex i is in a new component
label++;
BFS(i, L, label);
}// mark new component
}
return label;
}