n个点的一张图,问能否给每个点染上三种颜色中的一种,使得没有相邻的点颜色相同?

n <= 35。

Sample Input
4
6
6
0 3
1 5
3 2
2 5
0 4
1 0
7
12
6 5
0 3
2 6
3 5
5 0
0 4
4 5
6 3
1 4
1 2
3 4
2 3
7
8
6 5
0 3
2 6
3 5
1 4
1 2
3 4
2 3
6
9
0 1
1 2
2 3
5 2
5 3
3 4
2 4
1 4
4 5 Sample Output
Y
N
Y
N

  

先想的求出最大团,然后如果最大团的点数 > 3一定不可以。

最大团的点数 <= 3呢?一定可以吗?不是这样的。

下面这个图最大团是3,然而也是不满足条件的。

可以搜索,枚举第一个点染的颜色,就可以3*2^(n-1)暴力。

然而有一个优化就是可以先求出所有的联通块,然后对每个联通块这样暴力。

场上写的T了。。被大佬们反杀。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector> using namespace std;
const int maxn = ;
const int maxm = ;
const int INF=0x7f7f7f7f; int v[maxm], nxt[maxm], last[maxm];
int vis[maxn], d[maxn];
vector<int> vc[maxn];
int sz = ;
int n, m; void DFS(int k, int p)
{
vc[p].push_back(k);
vis[k] = ;
for (int i = last[k]; i; i = nxt[i])
if (!vis[v[i]]) DFS(v[i], p);
} void init()
{
sz = ;
for (int i = ; i < maxn; i++) vc[i].clear();
memset(last, , sizeof(last));
memset(vis, , sizeof(vis));
memset(d, , sizeof(d));
} void build(int x, int y)
{
sz++;
v[sz] = y, nxt[sz] = last[x], last[x] = sz;
} bool ok(int k)
{
for (int i = last[k]; i; i = nxt[i])
if (d[k] == d[v[i]]) return false;
return true;
} bool check(int p, int k)
{
if (k == vc[p].size()) return true;
int x = vc[p][k];
for (int i = ; i <= ; i++)
{
d[x] = i;
if (!ok(x)) continue;
if (check(p, k+)) return true;
}
d[x] = ;
return false;
} int main()
{
int t;
scanf("%d", &t);
for (int ca = ; ca <= t; ca++)
{
init();
scanf("%d%d", &n, &m); for (int i = ; i <= m; i++)
{
int x, y;
scanf("%d%d", &x, &y);
build(x, y), build(y, x);
} int cnt = ;
for (int i = ; i < n; i++)
if (!vis[i])
{
++cnt;
DFS(i, cnt);
} int flag = true;
for (int i = ; i <= cnt; i++)
if (!check(i, )) { flag = false; break; } printf("%c\n", flag ? 'Y':'N'); }
}

UVALive - 8273 Assigning Frequencies (搜索 )的更多相关文章

  1. UVALive 6255 Kingdoms --状态搜索

    题意:n个国家,给出国家间相互的债务关系,每个国家如果债务>收入就要破产,破产后该国的所有债务关系全部清除,第一个破产的国家不同有可能造成最后的没破产的国家的不同,问哪些国家有可能成为独自存活的 ...

  2. UVALive 5107 dfs暴力搜索

    题目链接:A hard Aoshu Problem DES:给三个字符串,包含的字符是A-E范围内的.长度都不超过8.每个字符可以而且只可以匹配一个数字.两个字符不能匹配相同的数字.前两个式子之间可以 ...

  3. UVALive 5844 dfs暴力搜索

    题目链接:UVAive 5844 Leet DES:大意是给出两个字符串.第一个字符串里的字符可以由1-k个字符代替.问这两个字符串是不是相等.因为1<=k<=3.而且第一个字符串长度小于 ...

  4. Railroad UVALive - 4888 记忆化搜索

    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  5. uva 6957 Hyacinth bfs

    Hyacinth Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/problem/viewPro ...

  6. UVALive 4864 Bit Counting --记忆化搜索 / 数位DP?

    题目链接: 题目链接 题意:如果一个数二进制n有k位1,那么f1[n] = k,如果k有s位二进制1,那么f2[n] = f1[k] = s.  如此往复,直到fx[n] = 1,此时的x就是n的”K ...

  7. UVALive 6470 Chomp --记忆化搜索

    题意:给一个只有三行的方块阵(横向最多100个),然后p,q,r分别代表第1,2,3层的方格数,两人轮流去掉一个格子,此时这个格子的右上方都会被去掉,面临只剩最左下角的一个格子的状态的人输,问先手能否 ...

  8. UVALIVE 5893 计算几何+搜索

    题意:很复杂的题意,我描述不清楚. 题目链接:http://acm.bnu.edu.cn/bnuoj/contest_show.php?cid=3033#problem/33526 大致是,给定一个起 ...

  9. UVALive 6168 Fat Ninjas --二分小数+搜索

    题意:一个NxN的网格地板,有一些激光束从天花板垂直射向地面的某个网格,一个圆要安全地从左走到右,不碰到上边界,下边界以及激光束,问这个圆的直径最大能达到多大. 分析:可以二分直径,关键在check函 ...

随机推荐

  1. openstack安装newton版本创建虚拟机(五)

    一.创建网络: 1.在控制节点上创建一个单一扁平网络(名字:flat),网络类型为flat,网络适共享的(share),网络提供者:physnet1,它是和eth0关联起来的 [root@linux- ...

  2. vue学习之路之需要了解的知识汇总

    一.vue是什么? 相关网页:  https://vuejs.bootcss.com/v2/guide/       及菜鸟教程       https://www.runoob.com/vue2/v ...

  3. 常用的 HTML 头部标签

    曾几何时,我们已经不再手写 HTML 标签.Emmet.Markdown 等工具让我们「健步如飞」,但是我们真的了解这些标签了吗? 基本标签 使用 HTML5 doctype,不区分大小写. < ...

  4. 牛客NOIP提高组(二)题解

    心路历程 预计得分:100 + 40 + 30 = 170 实际得分:100 + 30 + 0 = 130 T2有一个部分分的数组没开够RE了. T3好像是思路有点小问题.. 思路没问题,实现的时候一 ...

  5. 解决ajax 遇到session失效后自动跳转的问题

    在项目中,经常会遇到session失效后,点击任何链接无反应的情况!这样给客户的体验就不是很好,以为是系统出了故障!所以在项目中我们会处理session失效后的跳转问题(一般给用户提示,并跳转后登录页 ...

  6. SQL 中的group by (转载)

    概述 原始表 简单Group By Group By 和 Order By Group By中Select指定的字段限制 Group By All Group By与聚合函数 Having与Where ...

  7. Android视图控件架构分析之View、ViewGroup

    在Android中,视图控件大致被分为两类,即ViewGroup和View,ViewGroup控件作为父控件,包含并管理着子View,通过ViewGroup和View便形成了控件树,各个ViewGou ...

  8. CoreData介绍

    http://blog.csdn.net/zh952016281/article/details/52105683 写在前面 在CoreData中有一些常用的类,称呼可能各不相同.所以这里先约定一些关 ...

  9. linux必会命令-查询-tail

    先说一个tail使用的例子: tail -n 20 filename 说明:显示filename最后20行. Linux下tail命令的使用方法.linux tail命令用途是依照要求将指定的文件的最 ...

  10. Dojo的declare接口

    declare(classname,[],{}) declare的第一个参数是可选的,代表类的名称 declare的第二个参数代表类的继承关系,比如继承哪一个父类,可以看到:第二个参数是一个数组,所以 ...