算法导论22.2-6 好选手、坏选手

2014-11-24 01:35:54 · 作者: · 浏览: 4
//算法导论22.2-6题 “好选手、差选手”
//题意就是要判断一个图是否是二分图
//二分图又称双分图、二部图、偶图,指顶点可以分成两个不相交的集使得在同一个集内的顶点不相邻(没有共同边)的图。
//二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(U,V),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in U,j in V),则称图G为一个二分图。
//无向图G为二分图的充分必要条件是,G至少有两个顶点,且其所有回路的长度均为偶数。
//二分图没有奇数圈!这是我们解题的依据。
//深度(或广度)优先搜寻中,若两个灰色节点有边连接,且二者的深度(到根节点的距离)之和为偶数,则表明存在有奇数个顶点的回路,即该图不是二分图。
//我们画出“广度优先树”,每个节点与他相邻的节点最多相差一层,或者在同一层,我们只需判断他们俩组成的回路是否是奇数个顶点。
#include   
#include   
#include   
#include   
using namespace std;  
  
const int num = 8;  
  
int start = 0;  
int edge[num][num];  
vector> v(num, vector());  
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
q; q.push(start); visited[start] = 1; goodOrBad[start] = true; while (!q.empty()) { int tmp = q.front(); q.pop(); cout<>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<