UVA Bicoloring (交叉染色)

 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



   题意:输入n个点,m组数据,然后有两种不同的颜色,n个点可能相互相邻。要求相邻的两个点不能用一种颜色,问是否可以做到,可以做到输出
代码:

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
#include<math.h>

using namespace std;

int n,m;
int map[205][205];
int v[205];

void BFS()
{
    int p[100010];
    for(int i=0;i<n;i++)
    {
        p[i] = -1;
    }
    memset(v,0,sizeof(v));
    queue<int>q;
    int flag = 0;
    int t,f;
    t = 0;
    p[t] = 0;
    q.push(t);
    v[t] = 1;
    while(!q.empty())
    {
        t = q.front();
        q.pop();
        for(int i=0;i<n;i++)
        {
            if(map[t][i] == 1)
            {
               if(p[i] == -1)
               {
                   p[i] = (int)fabs(p[t] - 1);
                   q.push(i);
               }
               else if(p[t] == p[i])
                {
                    flag = 1;
                    break;
                }
            }
        }
        if(flag == 1)
        {
            break;
        }
    }
    if(flag == 1)
    {
        printf("NOT BICOLORABLE.\n");
    }
    else
    {
        printf("BICOLORABLE.\n");
    }
}

int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        if(n == 0)
        {
            break;
        }
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                map[i][j] = 0;
            }
        }
        scanf("%d",&m);
        int a,b;
        for(int i=0;i<m;i++)
        {
            scanf("%d%d",&a,&b);
            map[a][b] = 1;
            map[b][a] = 1;
        }
        BFS();
    }
    return 0;
}
时间: 2024-10-15 18:45:46

UVA Bicoloring (交叉染色)的相关文章

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

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

交叉染色法判断二分图

题目链接:传送门 题目大意:给你一副无向联通图,判断是不是二分图 题目思路:交叉染色法 下面着重介绍下交叉染色法的定义与原理 首先任意取出一个顶点进行染色,和该节点相邻的点有三种情况: 1.未染色    那么继续染色此节点(染色为另一种颜色) 2.已染色但和当前节点颜色不同      跳过该点 3.已染色并且和当前节点颜色相同       返回失败(该图不是二分图) 下面在拓展两个概念: (1) 如果一个双连通分量内的某些顶点在一个奇圈中(即双连通分量含有奇圈),那么这个双连通分量的其他顶点也在

poj2942 双联通分量+交叉染色法判断二分图

Knights of the Round Table Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 11805   Accepted: 3870 Description Being a knight is a very attractive career: searching for the Holy Grail, saving damsels in distress, and drinking with the oth

uva 10004 Bicoloring(二染色)

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

UVa 10004 二染色

题意:给定一个无向图,是强连通的,而且无自回路.对顶点进行染色,相邻的顶点需要用不同的颜色,但总共只有两种颜色,是否可行. 思路:二部图的判定.其实通过题意思考,也可以发现,如果没有回路是可以的,如果有回路,而回路的顶点个数是偶数个也是可以的,是奇数个则不行.而这正是二部图的充要条件:无向图的所有回路长度都为偶数.  但这里如何判断回路长度不好实现.  这里的思路是,对图进行遍历,dfs或bfs都可以,在遍历的过程中进行染色,当发现冲突时即不可行. Code: #include<stdio.h>

二分图判断(交叉染色)

二分图又称二部图. 二分图是无向图. 设G=(V,E)是一个无向图.如顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属两个不同的子集. 例如这就是一个二分图. 大概就是把顶点分成两堆,每堆内部没有边. 无向图G为二分图的充分必要条件是,G至少有两个顶点, 且其所有回路的长度均为偶数. 最大独立点集:在二分图中,求最少的点集,使得任意两个点之间没有直接边连接. 最小点覆盖:在二分图中,求最少的点集,使得每一条边至少都有端点在这个点集中. 二分图判断:二分图染色. 给一个无向图

POJ 2942 Knights of the Round Table (点-双连通分量 + 交叉法染色判二分图)

POJ 2942 Knights of the Round Table 链接:http://poj.org/problem?id=2942 题意:亚瑟王要在圆桌上召开骑士会议,为了不引发骑士之间的冲突,并且能够让会议的议题有令人满意的结果,每次开会前都必须对出席会议的骑士有如下要求: 1. 相互憎恨的两个骑士不能坐在直接相邻的2个位置: 2. 出席会议的骑士数必须是奇数,这是为了让投票表决议题时都能有结果. 如果出现有某些骑士无法出席所有会议(例如这个骑士憎恨所有的其他骑士),则亚瑟王为了世界和

AOAPC-I: 算法竞赛入门经典 UVa 习题集分类

数据结构基础 UVa 10004 二染色:二部图的判定.(bfs或dfs遍历的过程进行染色,看是否有冲突) UVa 10129 单词:有向图的欧拉道路. UVa 10054 项链:无向图的欧拉回路,首尾相接输出路径. UVa 10596 清晨漫步:无向图的欧拉回路. (对于欧拉道路或回路,在判断连通性等时注意先 if 下要访问的顶点是否出现.)

hdu 4751 2013南京赛区网络赛 二分图判断 **

和以前做过的一个二分图颇为相似,以前的是互相不认识的放在一组,这个是互相认识的,本质上是相同的 是 hdu 2444 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace st