编程算法 - 二部图确定 代码(C)

本文介绍了一种使用深度优先搜索(DFS)算法解决二部图问题的方法。通过将图中的每个顶点染为两种不同的颜色,并确保相邻顶点颜色不同来判断一个图是否可以被划分为两个独立的子集。

二部图确定 代码(C)


本文地址: http://blog.youkuaiyun.com/caroline_wendy


题目: 给定一个具有n个顶点的图. 要给图上每一个顶点染色, 而且要使相邻的顶点颜色不同. 

能否最多用2种颜色进行染色. 没有重边和闭环.


二分图问题.


使用深度优先搜索(dfs), 把顶点染成c, 然后相邻边染成-c. 

假设相邻边被染色过, 且同样, 则图不是二分图; 假设全部边都被染色, 而且互不同样, 则是二分图.


进行多次搜索, 避免非连通图.


代码:

/*
 * CppPrimer.cpp
 *
 *  Created on: 2014.7.27
 *      Author: Caroline
 */

/*eclipse cdt*/

#include <stdio.h>

#include <vector>

using namespace std;

class Program {
	static const int MAX_V = 100;

	/*vector<int> G[MAX_V] = {{1,3}, {0,2}, {1,3}, {0,2}};
	int V = 4;*/

	vector<int> G[MAX_V] = {{1,2}, {0,2}, {0,1}};
	int V = 3;

	int color[MAX_V] = {0};

	bool dfs(int v, int c) {
		color[v] = c;
		for (size_t i=0; i<G[v].size(); ++i) {
			if (color[G[v][i]] == c) return false;
			if (color[G[v][i]] == 0 && !dfs(G[v][i], -c)) return false;
		}
		return true;
	}
public:

	void solve() {
		for (int i=0; i<V; i++) {
			if (color[i] == 0) {
				if(!dfs(i,1)) {
					printf("result = No\n");
					return;
				}
			}
		}
		printf("result = Yes\n");
	}
};

int main (void)
{
	Program iP;
	iP.solve();

	return 0;

}


输出:

result = No








版权声明:本文博客原创文章,博客,未经同意,不得转载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值