算法导论22.2-6 好选手、坏选手
2013-11-05 14:06
197 查看
//算法导论22.2-6题 “好选手、差选手”
//题意就是要判断一个图是否是二分图
//二分图又称双分图、二部图、偶图,指顶点可以分成两个不相交的集使得在同一个集内的顶点不相邻(没有共同边)的图。
//二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(U,V),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in U,j in V),则称图G为一个二分图。
//无向图G为二分图的充分必要条件是,G至少有两个顶点,且其所有回路的长度均为偶数。
//二分图没有奇数圈!这是我们解题的依据。
//深度(或广度)优先搜寻中,若两个灰色节点有边连接,且二者的深度(到根节点的距离)之和为偶数,则表明存在有奇数个顶点的回路,即该图不是二分图。
//我们画出“广度优先树”,每个节点与他相邻的节点最多相差一层,或者在同一层,我们只需判断他们俩组成的回路是否是奇数个顶点。
//题意就是要判断一个图是否是二分图
//二分图又称双分图、二部图、偶图,指顶点可以分成两个不相交的集使得在同一个集内的顶点不相邻(没有共同边)的图。
//二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(U,V),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in U,j in V),则称图G为一个二分图。
//无向图G为二分图的充分必要条件是,G至少有两个顶点,且其所有回路的长度均为偶数。
//二分图没有奇数圈!这是我们解题的依据。
//深度(或广度)优先搜寻中,若两个灰色节点有边连接,且二者的深度(到根节点的距离)之和为偶数,则表明存在有奇数个顶点的回路,即该图不是二分图。
//我们画出“广度优先树”,每个节点与他相邻的节点最多相差一层,或者在同一层,我们只需判断他们俩组成的回路是否是奇数个顶点。
#include <iostream> #include <fstream> #include <vector> #include <queue> using namespace std; const int num = 8; int start = 0; int edge[num][num]; vector<vector<int>> v(num, vector<int>()); int visited[num]; int distances[num]; bool goodOrBad[num]; bool BSF_AdjList() { memset(distances, 0, sizeof(distances)/sizeof(int)); memset(visited, 0, sizeof(visited)/sizeof(bool)); queue<int> q; q.push(start); visited[start] = 1; goodOrBad[start] = true; while (!q.empty()) { int tmp = q.front(); q.pop(); cout<<tmp<<" "; for(int i = 0; i < v[tmp].size(); i++) { if(visited[v[tmp][i]] == 1 && (distances[tmp] + distances[v[tmp][i]]) % 2 == 0) return false; if(!visited[v[tmp][i]]) { q.push(v[tmp][i]); visited[v[tmp][i]] = 1; distances[v[tmp][i]] = distances[tmp] + 1; goodOrBad[v[tmp][i]] = !goodOrBad[tmp]; } } visited[tmp] = 2; } cout<<endl; return true; } int main() { start = 0; fstream cin("a.txt"); int a, b; for(int i = 0; i < num; i++) for(int j = 0; j < num; j++) edge[i][j] = 0; int count; cin>>count; while(count--) { cin>>a>>b; edge[a][b] = edge[b][a] = 1; v[a].push_back(b); v[b].push_back(a); } bool s = BSF_AdjList(); cout<<s<<endl; //BSF_AdjMatrix(); }
相关文章推荐
- 算法导论22.2-6:好选手、坏选手问题
- 欧拉回路问题(算法导论22.2-8 和22-3)
- 算法导论 第22章 图算法 22.2 广度优先搜索
- 两次BFS求树的直径(算法导论22.2-7)
- 算法导论22.2广度优先搜索 练习总结
- 【算法导论】22.2-7 树的直径问题
- 树的直径 算法导论22.2-7
- 判断一个图是否为二分图且输出结点二分的两个部分(算法导论22.2-6)
- 准备啃算法导论这本书了
- 【读书笔记】算法导论(第三版)第一章
- 【算法导论】最大二分匹配
- 【算法导论学习-22】二叉树专题1:一般二叉树的实现和常用处理函数
- 【算法导论学习-23】两个单链表(single linked)求交点
- 算法导论之快速排序
- 算法导论之计算几何学
- LongestCommonSequence 最长连续公共子序列(算法导论是最长公共子序列)
- 算法导论习题5.1-3
- [算法导论] 15.1 动态规划初步 装配链c语言实现
- 【算法导论 第6章 堆排序】
- 【算法导论】线性时间选择---从数组中选择第i小的数