UVA - 10004 - Bicoloring (简单图论-着色判断)

UVA - 10004

Bicoloring

Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu

Submit Status

Description

 Bicoloring 

In 1976 the ``Four Color Map Theorem" was proven with the assistance of a computer. This theorem states that every map can be colored using only four colors, in such a way that no region is colored using the same color as a neighbor region.

Here you are asked to solve a simpler similar problem. You have to decide whether a given arbitrary connected graph can be bicolored. That is, if one can assign colors (from a palette of two) to the nodes in
such a way that no two adjacent nodes have the same color. To simplify the problem you can assume:

  • no node will have an edge to itself.
  • the graph is nondirected. That is, if a node a is said to be connected to a node b, then you must assume that b is connected to a.
  • the graph will be strongly connected. That is, there will be at least one path from any node to any other node.

Input

The input consists of several test cases. Each test case starts with a line containing the number n ( 1 < n < 200) of different nodes. The second line contains the number of edges l. After this, l lines will follow, each
containing two numbers that specify an edge between the two nodes that they represent. A node in the graph will be labeled using a number a ( ).

An input with n = 0 will mark the end of the input and is not to be processed.

Output

You have to decide whether the input graph can be bicolored or not, and print it as shown below.

Sample Input

3
3
0 1
1 2
2 0
9
8
0 1
0 2
0 3
0 4
0 5
0 6
0 7
0 8
0

Sample Output

NOT BICOLORABLE.
BICOLORABLE.

Miguel Revilla

2000-08-21

Source

Root :: Competitive Programming 3: The New Lower Bound of Programming Contests (Steven & Felix Halim) :: Graph :: Graph Traversal :: Bipartite
Graph Check

Root :: Competitive Programming 2: This increases the lower bound of Programming Contests. Again (Steven & Felix Halim) :: Graph :: Graph Traversal :: Bipartite
Graph Check

Root :: AOAPC I: Beginning Algorithm Contests (Rujia Liu) :: Volume 2. Data Structures :: Graphs

Root :: Programming Challenges (Skiena & Revilla) :: Chapter 9

Root :: Competitive Programming: Increasing the Lower Bound of Programming Contests (Steven & Felix Halim) :: Chapter 4. Graph :: Breadth First Search :: Variants

Submit Status

思路:DFS,每次使一个点着色(这里抽象颜色为1或2),每次要着色这个点之前加个判断,看是否现在满不满足与之相邻的点是否是同一种颜色

AC代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#define LL long long
#define INF 0x7fffffff
using namespace std;

const int maxn = 205;
int color[maxn];
int map[maxn][maxn];
int n, l;

int judge(int x) {
	int f1 = 0, f2 = 0;
	for(int i = 0; i < n; i++) {
		if(map[x][i]) {
			if(color[i] == 1) f1 = 1;
			else if(color[i] == 2) f2 = 1;
		}
	}
	if(f1 && f2) return 1;
	return 0;
}

int dfs(int x) {
	for(int i = 0; i < n; i++) {
		if(map[x][i] && !color[i]) {
			if(judge(i)) return 0;
			if(color[x] == 1) color[i] = 2;
			else if(color[x] == 2) color[i] = 1;
			dfs(i);
		}
	}
	return 1;
}

int main() {
	while(scanf("%d", &n), n) {
		scanf("%d", &l);
		memset(map, 0, sizeof(map));
		for(int i = 0; i < l; i++) {
			int u, v;
			scanf("%d %d", &u, &v);
			map[u][v] = 1;
			map[v][u] = 1;
		}

		/*for(int i = 0; i< n; i++, printf("\n")) {
			for(int j = 0; j < n; j++) {
				printf("%d ", map[i][j]);
			}
		}*/

		memset(color, 0, sizeof(color));
		color[0] = 1;
		if(dfs(0)) {
			//for(int i = 0; i < n; i++) printf("%d ", color[i]);
			printf("BICOLORABLE.\n");
		}
		else {
			//for(int i = 0; i < n; i++) printf("%d ", color[i]);
			printf("NOT BICOLORABLE.\n");
		}
	}
	return 0;
} 
时间: 2025-01-03 00:27:59

UVA - 10004 - Bicoloring (简单图论-着色判断)的相关文章

UVA 10004 Bicoloring

题目如下: Bicoloring  In 1976 the ``Four Color Map Theorem" was proven with the assistance of acomputer. This theorem states that every map can be colored using only fourcolors, in such a way that no region is colored using the same color as aneighbor re

uva 10004 Bicoloring(DFS)

uva 10004 Bicoloring In 1976 the ``Four Color Map Theorem" was proven with the assistance of acomputer. This theorem states that every map can be colored using only fourcolors, in such a way that no region is colored using the same color as aneighbor

UVA - 10004 Bicoloring(判断二分图——交叉染色法 / 带权并查集)

d.给定一个图,判断是不是二分图. s.可以交叉染色,就是二分图:否则,不是. 另外,此题中的图是强连通图,即任意两点可达,从而dfs方法从一个点出发就能遍历整个图了. 如果不能保证从一个点出发可以遍历整个图,那么编程要注意了,应该从每个点出发遍历一次. s2.带权并查集来判断,略复杂.先略过.先上个博客:http://blog.csdn.net/zsc09_leaf/article/details/6727622 c.邻接矩阵,bfs #include<iostream> #include&

uva 10004 Bicoloring(二染色)

这道题我始终还是看了题解,不过有进步的是我看了他的想法自己实现的,恩恩,就是要这样 ,一定得先有个正确的 想法,这样才能做对题,敲代码之前想法就错了那么一定做不对题目的,我之前想的是只要存在环就不会实现去全部染 色,其实是可以的,当这个环是奇数的时候就可以,偶数的时候不可以.所以我用的dfs每次遍历的时候遇到没有染色 的就染色,遇到染过色的就判断一下是否是一样的颜色. 贴代码: #include<stdio.h> #include<stdlib.h> #include<str

UVA 10004 Bicoloring(DFS染色)

题意: 给N个点构成的无环无向图,并且保证所有点对都是连通的. 给每个点染色,要么染成黑要么染成白.问是否存在染色方案使得所有有边相连的点对颜色一定不一样. 是输出 BICOLORABLE 否则输出 NOT BICOLORABLE 思路: 从某点开始,直接进行染色,如果矛盾,返回false. 代码: int n,l; vector<int> graph[205]; int color[205]; bool dfs(int u,int fa){ if(color[fa]==0) color[u]

UVa 725 Division --- 简单枚举

题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=666 /* UVa 725 Division --- 简单枚举 */ #include <cstdio> #include <cstring> bool used[10]; /* 判断传进来的两个数是否满足条件 */ bool judge(int a, i

uva 10004(图)

题解:本来想着用dfs,后来写着写着就成普通的循环了,将起始点0先涂色,然后把和他相邻的其他点涂成另一种颜色,再从下一个点搜索,如果有连线但已经被涂色且和自己颜色一样就可以判断结果是错. #include <stdio.h> #include <string.h> const int N = 200 + 5; int n, l, G[N][N], vis[N], flag; void init() { memset(G, 0, sizeof(G)); memset(vis, 0,

个人总结-----非贪心算法的图的m着色判断及优化问题

1.问题描述: 对于著名的图的m着色,有两个主要的问题,一个是图的m色判定问题,一个是图的m色优化问题,描述如下. 图的m色判定问题: 给定无向连通图G和m种颜色.用这些颜色为图G的各顶点着色.问是否存在着色方法,使得G中任2邻接点有不同颜色. 图的m色优化问题:给定无向连通图G,为图G的各顶点着色, 使图中任2邻接点着不同颜色,问最少需要几种颜色.所需的最少颜色的数目m称为该图的色数. 对于网上或书上的一些求解方式主要用贪心算法求解的方式,也有用回溯法的方式(一般不用,时空太大).如这位博主 

cdoj1580 简单图论问题

地址:http://acm.uestc.edu.cn/#/problem/show/1580 题目: 简单图论问题 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 给出一个无向图,该图由nn个点和mm条边组成,每个点和每条边都有一个权值.对于该图的任意一个子图,我们定义A是该子图的点权和,B是该子图的边权和,C=A/b=AB是该子图的powerpow