您的位置:首页 > 其它

算法导论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至少有两个顶点,且其所有回路的长度均为偶数。

//二分图没有奇数圈!这是我们解题的依据。

//深度(或广度)优先搜寻中,若两个灰色节点有边连接,且二者的深度(到根节点的距离)之和为偶数,则表明存在有奇数个顶点的回路,即该图不是二分图。

//我们画出“广度优先树”,每个节点与他相邻的节点最多相差一层,或者在同一层,我们只需判断他们俩组成的回路是否是奇数个顶点。

#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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: