在图论中,割点(Articulation Point)是描述在连通图中,移除某个顶点及其相关边后,图的连通性发生变化的点。以下是 Objective-C 中实现割点算法的完整代码示例。
#import @interface Graph : NSObject @property (nonatomic, strong) NSMutableArray *vertices; @property (nonatomic, strong) NSMutableArray *edges; @property (nonatomic, strong) NSMutableArray *adjacencyList;
// 初始化图的顶点和边-(void)initializeGraph{self.vertices = [NSMutableArray new];self.edges = [NSMutableArray new];self.adjacencyList = [NSMutableArray new];}// 添加顶点 -(void)addVertex:(id)vertex { [self.vertices addObject:vertex]; } // 添加边 -(void)addEdge:(id)edge fromVertex:(id)from toVertex:(id)to { [self.edges addObject:edge]; [self.adjacencyList[fromVertex] addObject:toVertex]; [self.adjacencyList[toVertex] addObject:fromVertex]; } //DFS 遍历并找出割点 -(NSArray *)findArticulationPoints { NSMutableArray *points = [NSMutableArray new]; [self dfs:0 visited:[NSMutableArray new] disc:[NSMutableArray new] low:[NSMutableArray new]]; return points; } //DFS 记录 -(void)dfs:(int)u visited:(NSMutableArray *)visited disc:(NSMutableArray *)disc low:(NSMutableArray *)low { visited[u] = YES; disc[u] = [NSDate timeIntervalSinceReferenceDate]; low[u] = disc[u]; for (id v in self.adjacencyList[u]) { if (!visited[v]) { [self dfs:v visited:visited disc:disc low:low]; low[u] = [low[u] < low[v]] ? low[u] : low[v]; } else if (v != parent[u]) { low[u] = [low[u] < disc[v]] ? low[u] : disc[v]; } } if (low[u] > disc[u]) { [points addObject:u]; } } 该代码实现了通过深度优先搜索(DFS)来识别图中的割点。通过记录每个顶点的访问时间(disc)和低值(low),算法可以判断移除某个顶点后对图的连通性是否有影响。