算法导论22.2-6:好选手、坏选手问题
2012-11-20 21:46
197 查看
Q:有两种类型的职业摔跤选手:一种是好“选手”,一种是坏“选手”。对于任意一对摔跤职业选手来说,他们中可能有,也可能没有比赛。假定有n位摔跤职业选手,并且有一份清单,上面列出了r对参加比赛的摔跤手。试给出一个o(n+r)时间的算法,它能否确定是否指定某些摔跤手为好选手,而将余下的摔跤手指定为坏选手,从而使得每一场比赛都是在一个好选手与一个坏选手之间进行。如果有可能做出这样的指定,你的算法就应该将它产生出来。
一、等价于判断图是否为二分图(二着色)的问题
二分图,就是顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个节点都分属于这两个互不相交的子集。如下图所示:
二、判断这个图是不是二分图
将好选手归为一类,坏选手归为一类。
若是某个图为二分图的话,当且仅当图中所有的回路都为偶数个顶点,顶点个数至少为2。因此,判断图中是否存在有奇数个顶点的回路即可。判断方法:
1、深度(或广度)优先搜寻中,若两个灰色节点有边连接,且二者的深度(到根节点的距离)之和为偶数,则表明存在有奇数个顶点的回路,即该图不是二分图。
2、如果该图没有回路,那一定是可以二分的;若有回路,则回路中节点的度数一定 >=2。
统计每个节点的度数;
删除所有度数<1的节点(将该节点对应的边删除,并将对应的顶点的度数-1);
然后将更新后的顶点度数为1的所有点加入队列当中,对队列中的每个元素重复上一步,即删除度数为1的点。最后如果还有没有被删除的节点(即还存在度数>=2的节点),证明图中存在回路。如果全部都已删除则图中不存在回路,即图是二分的;
如果存在回路,对剩下的每一个节点,统计从这个节点开始的所有回路(DFS),并记录路径的长度,标记访问状态,如果存在奇数边回路就表明不是二分图。否则,运行直到所有节点都被访问完毕。
一、等价于判断图是否为二分图(二着色)的问题
二分图,就是顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个节点都分属于这两个互不相交的子集。如下图所示:
二、判断这个图是不是二分图
将好选手归为一类,坏选手归为一类。
若是某个图为二分图的话,当且仅当图中所有的回路都为偶数个顶点,顶点个数至少为2。因此,判断图中是否存在有奇数个顶点的回路即可。判断方法:
1、深度(或广度)优先搜寻中,若两个灰色节点有边连接,且二者的深度(到根节点的距离)之和为偶数,则表明存在有奇数个顶点的回路,即该图不是二分图。
2、如果该图没有回路,那一定是可以二分的;若有回路,则回路中节点的度数一定 >=2。
统计每个节点的度数;
删除所有度数<1的节点(将该节点对应的边删除,并将对应的顶点的度数-1);
然后将更新后的顶点度数为1的所有点加入队列当中,对队列中的每个元素重复上一步,即删除度数为1的点。最后如果还有没有被删除的节点(即还存在度数>=2的节点),证明图中存在回路。如果全部都已删除则图中不存在回路,即图是二分的;
如果存在回路,对剩下的每一个节点,统计从这个节点开始的所有回路(DFS),并记录路径的长度,标记访问状态,如果存在奇数边回路就表明不是二分图。否则,运行直到所有节点都被访问完毕。
相关文章推荐
- 【算法导论】22.2-7 树的直径问题
- 欧拉回路问题(算法导论22.2-8 和22-3)
- 算法导论22.2-6 好选手、坏选手
- 小sugar呀____最大子数组问题(算法导论)
- 算法导论第二章问题研究
- 算法导论-第15章-动态规划-15.1 钢条切割问题
- 算法导论 第16章 贪心算法-活动选择问题C++实现
- 【算法导论】0-1背包问题
- [算法导论]动态规划---最长公共最序列问题
- 两次BFS求树的直径(算法导论22.2-7)
- 流水线调度问题实现(动态规划基础---------问题取自算法导论)
- 算法导论-任务调度问题
- 活动选择问题(算法导论第16章(贪心算法)
- 算法导论16.2-2--动态规划(0-1背包问题)
- 动态规划之钢条切割问题自底向上发的实现(算法导论第15章)
- 树的直径 算法导论22.2-7
- 【算法导论学习-29】动态规划经典问题02:最长公共子序列问题(Longest common subsequence,LCS)
- 算法导论15章 动态规划之矩阵链乘法问题
- 区间图着色问题(算法导论课后题目16.1.3)
- 算法导论之最大子数组问题 C语言实现