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, sizeof(vis));
    flag = 0;
}
void dfs(int x) {
  for (int i = 0; i < n; i++) {
      if (G[x][i] && vis[i] == 0) {
          if (vis[x] == 1)
            vis[i] = 2;
          else
            vis[i] = 1;
      }
      else if (G[x][i] && vis[i] != 0) {
          if (vis[i] == vis[x]) {
              flag = 1;
          }
      }
    }
}
int main () {
  int v1, v2;
  while (scanf("%d", &n) && n) {
    init();
    scanf("%d", &l);
    for (int i = 0; i < l; i++) {
      scanf("%d %d", &v1, &v2);
      G[v1][v2] = G[v2][v1] = 1;
    }
    vis[0] = 1;
    for (int i = 0; i < n; i++)
        dfs(i);
    if (flag)
      printf("NOT BICOLORABLE.\n");
    else
      printf("BICOLORABLE.\n");
  }
  return 0;
}

uva 10004(图)

时间: 2024-10-15 15:02:20

uva 10004(图)的相关文章

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 (简单图论-着色判断)

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 二染色

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

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

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

Uva 10004(二分图的判定)

这题其实很简单的说,第一次用邻接表来存图= = 首先图的储存结构是结构体+head数组...其实head数组保存的 struct node { int v; int next; }V[200*200]; 假设现在有u节点,v表示的是和他邻接的点,next保存的是v对应的编号,head数组保存的是链表的头节点编号. 比如有 1 2 1 3 1 4的点边关系那么V[head[1]].v=4;V[head[2]].v=1,V[head[3]].v=1; 现在讲讲如何判断图是不是二分图,首先对任意没染色

UVa 193 图着色

题意:给一个图,可以染白色和黑色,但是染黑色的结点不能相邻.求最多的黑色结点个数,和一种可能的黑色结点序列. 思路:这个用回溯法还是很容易想到怎么写的.dfs每一个位置,知道所有位置dfs完.对每个位置都尝试黑色和白色.如果染黑色,那么就需要把和它相邻的结点染成白色,因为他们必须是白色,如果发现有相邻结点已经是黑色,则当前结点不能是黑色:而因为dfs后需要对辅助的全局变量进行恢复,所以这里在将相邻结点染成白色前先判断它是不是已经是白色了,因为如果它已经是白色在恢复的时候就不需要再恢复了,否则需要

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 10004 Bicoloring(二染色)

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