问题描述
class graph{
void Dfsutil(int v);
public:
map<int,vector<int> > adj;
map<int,bool> visited;
map<int,int> color;
int twoteams = 1;
void DFS();
void addEdge(int u,int v);
};
void graph::addEdge(int u,int v){
adj[u].push_back(v);
}
深度优先搜索功能。 我试图将孩子着色为 !parent (如果我没有错): 如果孩子和父母的颜色相同,则表示该图不是二部图
void graph::Dfsutil(int v){
visited[v] = true;
for (auto i:adj[v]){
if(visited[i]==false){
color[i] = !color[v];
Dfsutil(i);
}
else if(color[i]==color[v]){
twoteams = 0;
return;
}
}
}
如果图有多个连通分量
void graph::DFS(){
for (auto i:adj){
if(!visited[i.first]) Dfsutil(i.first);
}
}
图给出为:B(一个向量):[[1,2],[1,3]...] 边:1-->2,1-->3...>
int Solution::solve(int A,vector<vector<int> > &B) {
graph g;
g.addEdge(B[0][0],B[0][1]);
g.color[B[0][0]] = 1;
int n = B.size();
for (int i=1;i<n;++i){
g.addEdge(B[i][0],B[i][1]);
}
g.DFS();
return g.twoteams;
}
为什么不检查图形是否是二部图。 color 将节点的颜色存储为 0 或 1; 如果不是二部则返回 0,否则返回 1
解决方法
要确定一个图是否是二部图,只需确定最大集团的数量正好为 2。
这是寻找最大团的伪代码
LOOP
CONSTRUCT empty current set
SELECT V arbitrary vertex
add V to current set
remove V from graph
LOOP // while set is growing
added_to_set = false
LOOP V over vertices in graph
LOOP Vset over current set
IF Vset connected to V
add V to current set
remove V from graph
added_to_set = true
break;
IF added_to_set == false
break; // the set is maximal
ADD current set to list of sets
IF graph has no remaining vertices
OUTPUT sets found
STOP
有关此的 C++ 实现,请参阅 https://github.com/JamesBremner/PathFinder2/blob/dbd6ff06edabd6a6d35d5eb10ed7972dc2d779a6/src/cPathFinder.cpp#L483
中的代码