我在SPOJ SPOJ:BUGLIFE上遇到了问题 它要求我检查图表是否是二分图。我知道单个连接图的方法,但是对于断开连接的图的组合,我的方法给出了超出时间限制的错误。 这是我的方法 - 广度优先搜索,使用循环队列和邻接列表实现的图形。 方法 - >选择一个源,如果该源顶点=未访问,则启动广度优先搜索,假设它是源。如果我在BFS中发现了冲突,那么我就放弃了整个事情。另外,我转移到另一个未访问的来源。 我怎样才能让它更快?或更好?
P.S。我是图论的新手,所以请详细解释。
答案 0 :(得分:0)
在非常大的数据集(edages> 1000)中进行测试时,以下实现(C ++版本)足够快。希望它有所帮助。
struct NODE
{
int color;
vector<int> neigh_list;
};
bool checkAllNodesVisited(NODE *graph, int numNodes, int & index);
bool checkBigraph(NODE * graph, int numNodes)
{
int start = 0;
do
{
queue<int> Myqueue;
Myqueue.push(start);
graph[start].color = 0;
while(!Myqueue.empty())
{
int gid = Myqueue.front();
for(int i=0; i<graph[gid].neigh_list.size(); i++)
{
int neighid = graph[gid].neigh_list[i];
if(graph[neighid].color == -1)
{
graph[neighid].color = (graph[gid].color+1)%2; // assign to another group
Myqueue.push(neighid);
}
else
{
if(graph[neighid].color == graph[gid].color) // touble pair in the same group
return false;
}
}
Myqueue.pop();
}
} while (!checkAllNodesVisited(graph, numNodes, start)); // make sure all nodes visited
// to be able to handle several separated graphs, IMPORTANT!!!
return true;
}
bool checkAllNodesVisited(NODE *graph, int numNodes, int & index)
{
for (int i=0; i<numNodes; i++)
{
if (graph[i].color == -1)
{
index = i;
return false;
}
}
return true;
}