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]=1;
    else
        color[u]=0;
    int L=graph[u].size();
    rep(i,0,L-1){
        int v=graph[u][i];
        if(v!=fa){
            if(color[v]==-1)
                dfs(v,u);
            else
                if(color[v]+color[u]!=1) return false;
        }
    }
    return true;
}

int main(){
    int start;
    while(scanf("%d",&n)!=EOF,n){
        scanf("%d",&l);
        rep(i,0,n-1) graph[i].clear();
        mem(color,-1); color[n]=0;
        while(l--){
            int u,v;
            scanf("%d%d",&u,&v); start=u;
            graph[u].push_back(v);
            graph[v].push_back(u);
        }
        bool yes=dfs(start,n);
        if(yes)
            puts("BICOLORABLE.");
        else
            puts("NOT BICOLORABLE.");
    }
}
时间: 2024-10-27 11:52:31

UVA 10004 Bicoloring(DFS染色)的相关文章

uva 10004 Bicoloring(二染色)

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

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

题目如下: 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 (简单图论-着色判断)

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 e

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

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

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,

UVALive 6663 Count the Regions --离散化+DFS染色

题意:给你n(n<=50)个矩形(左上角坐标和右下角坐标),问这些矩形总共将平面分成多少个部分.坐标值可能有1e9. 分析:看到n和坐标的范围,容易想到离散化,当时就没想到离散化以后怎么判断区域个数.后来看别人代码才知道,可以将边界上的点vis赋为1,那么枚举所有哈希后的平面上的点,遇到一个vis=0的点就从这点一直搜过去,搜到边界自动会停止了,因为边界vis=1,并且ans++,就可以了.真是太弱.. 代码: #include <iostream> #include <cstdi

hdu 5313 Bipartite Graph(dfs染色 或者 并查集)

Problem Description Soda has a bipartite graph with n vertices and m undirected edges. Now he wants to make the graph become a complete bipartite graph with most edges by adding some extra edges. Soda needs you to tell him the maximum number of edges

[UVA 11853]Paintball[DFS]

题目链接:[UVA 11853]Paintball[DFS] 题意分析: 在一个1000*1000的方块场地中,你需要从最左边开始一路避开敌人的攻击到达最右边.敌人有自己的坐标以及攻击范围,也就是一个圆形范围内你都不能碰到,问你能到达最右边吗?能的话输出左边进入的最大坐标(0,Ymax), 右边出去的最大坐标(1000,Ymax). 解题思路: 什么情况下不能到达目标呢?只有这种情况,也就是相邻的圆连接起来隔断了整个地图,否则都是可以到达的.这样的话,一个dfs直接判断就行了.剩下的是坐标怎么找