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

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;
}


你可能感兴趣的:(c++)