You are given a positive integer n representing the number of nodes in an undirected graph. The nodes are labeled from 1 to n.
You are also given a 2D integer array edges, where edges[i] = [aᵢ, bᵢ] indicates that there is a bidirectional edge between nodes aᵢ and bᵢ. Notice that the given graph may be disconnected.
Divide the nodes of the graph into m groups (1-indexed) such that:
Each node in the graph belongs to exactly one group.
For every pair of nodes in the graph that are connected by an edge [aᵢ, bᵢ], if aᵢ belongs to the group with index x, and bᵢ belongs to the group with index y, then |y - x| = 1.
Return the maximum number of groups (i.e., maximumm) into which you can divide the nodes. Return -1if it is impossible to group the nodes with the given conditions.
Input: n = 6, edges = [[1,2],[1,4],[1,5],[2,6],[2,3],[4,6]] Output: 4 Explanation: As shown in the image we:
Add node 5 to the first group.
Add node 1 to the second group.
Add nodes 2 and 4 to the third group.
Add nodes 3 and 6 to the fourth group.
We can see that every edge is satisfied. It can be shown that that if we create a fifth group and move any node from the third or fourth group to it, at least on of the edges will not be satisfied.
Example 2:
Input: n = 3, edges = [[1,2],[2,3],[3,1]] Output: -1 Explanation: If we add node 1 to the first group, node 2 to the second group, and node 3 to the third group to satisfy the first two edges, we can see that the third edge will not be satisfied. It can be shown that no grouping is possible.
Constraints:
1 <= n <= 500
1 <= edges.length <= 10⁴
edges[i].length == 2
1 <= aᵢ, bᵢ <= n
aᵢ != bᵢ
There is at most one edge between any pair of vertices.
fromcollectionsimportdequeclassSolution:defmagnificentSets(self,n:int,edges:list[list[int]])->int:max2=lambdaa,b:aifa>=belsebgraph:list[list[int]]=[[]for_inrange(n)]foru,vinedges:graph[u-1].append(v-1)graph[v-1].append(u-1)# Checks if the graph is bipartite.colors=[-1]*nforuinrange(n):ifcolors[u]>=0:continuecolors[u]=0stack=[u]whilestack:u=stack.pop()cu=colors[u]cv=1-cuforvingraph[u]:ifcolors[v]==-1:colors[v]=cvstack.append(v)elifcolors[v]==cu:return-1defbfs_depth(u:int)->int:"""Returns the max (0-indexed) depth starting from `u`."""visited=[False]*nvisited[u]=Truequeue=deque([u])depth=-1whilequeue:depth+=1for_inrange(len(queue)):# Process the whole layer together. All these nodes have the same depth.u=queue.popleft()forvingraph[u]:ifnotvisited[v]:visited[v]=Truequeue.append(v)returndepthdefdiameter(u:int)->int:"""Returns the diameter of sub-graph contains `u`.
Which is the max bfs-depth starting from every node of the sub-graph."""finished[u]=Truestack=[u]d=0whilestack:u=stack.pop()d=max2(d,bfs_depth(u))forvingraph[u]:ifnotfinished[v]:finished[v]=Truestack.append(v)returndgroup_cnt=0finished=[False]*nforuinrange(n):iffinished[u]:continuegroup_cnt+=diameter(u)+1returngroup_cnt
评论需要 JavaScript。