Advertisement
Guest User

Untitled

a guest
Aug 21st, 2019
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.18 KB | None | 0 0
  1. // 判断二分图
  2. // 二分图指可以将图的顶点集分为两个独立的子集 A 和 B,图中每条边的的两个结点都分别属于 A 或 B
  3. // 一个简单的思路是涂色:将每条边的两个顶点涂为不同的颜色,
  4. // 如果出现一条边的两个顶点是同一颜色,则该图一定不是二分图
  5.  
  6. class Solution {
  7. public:
  8. bool isBipartite(vector<vector<int>>& graph) {
  9. int n = graph.size();
  10. vector<int> colors = vector<int>(n);
  11. for(int i = 0; i < n; i++) {
  12. // 如果没有被涂色,并且尝试涂色失败
  13. if(colors[i] == 0 && !dfs(graph, colors, 1, i)) {
  14. return false;
  15. }
  16. }
  17. return true;
  18. }
  19.  
  20. private:
  21. bool dfs(vector<vector<int>>& graph, vector<int>& colors, int color, int i) {
  22. // 如果已被涂色
  23. if(colors[i])
  24. return colors[i] == color;
  25.  
  26. // 如果尚未被涂色
  27. // 涂色,并 dfs 判断是否有冲突
  28. colors[i] = color;
  29. for(int j = 0; j < graph[i].size(); j++) {
  30. if(!dfs(graph, colors, -color, graph[i][j]))
  31. return false;
  32. }
  33. return true;
  34. }
  35. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement