每次从一个未染色的节点出发,把与他相邻的未染色的节点染成相反的颜色,如果相邻节点已经被染色且颜色和他一致则返回false 全部染完且没报错则是二分图 另外主要注意非连通图的问题,需要多次从没染色的开始染色,防止出现某个子连通图不是二分图,二分图要求所有的连通图也全都是二分图
class Solution { public: bool isBipartite(vector<vector<int>>& graph) { int nums=graph.size(); struct Node{ int no=0; int color=0; }; queue<Node> q; Node nodes[nums]; for(int i=0;i<nums;i++) { if(nodes[i].color==0) { nodes[i].color=1; nodes[i].no=i; //记得给初始节点no赋值 否则一直为0 q.push(nodes[i]); while(!q.empty()) { Node top=q.front(); q.pop(); vector<int> edges=graph[top.no]; for(int i=0;i<edges.size();i++) { if(nodes[edges[i]].color==0) { nodes[edges[i]].color=(-top.color); nodes[edges[i]].no=edges[i]; //记得赋值 q.push(nodes[edges[i]]); } if(nodes[edges[i]].color==top.color) { return false; } } } } } return true; } };