题面

题解

神仙构造题。

分五种情况考虑:

  • 如果存在一个环,那么令环上的点权值为\(1\),其余点权值为\(0\)。
  • 如果存在一个度数大于\(3\)的点,令这个点的权值为\(2\),和它相邻的点权值为\(1\),否则权值为\(0\)。
  • 如果存在两个度数等于\(3\)的点,令这两个点的路径上点的权值为\(2\),其余的点权值为\(1\)。
  • 如果只有一个点度数为\(3\),那么这张图一定是这个点伸出三条链,设三条链的长度分别为\(l_1, l_2, l_3\),那么有解当且仅当\(\frac 1{l_1 + 1} + \frac 1{l_2 + 1} + \frac 1{l_3 + 1} \leq 1\)。
  • 如果没有点度数为\(3\),可以证明一定无解。

于是就可以按照结论欢乐构造了。

代码

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define file(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout) inline int read()
{
int data = 0, w = 1; char ch = getchar();
while (ch != '-' && (ch < '0' || ch > '9')) ch = getchar();
if (ch == '-') w = -1, ch = getchar();
while (ch >= '0' && ch <= '9') data = data * 10 + (ch ^ 48), ch = getchar();
return data * w;
} const int maxn(1e5 + 10);
struct edge { int next, to; } e[maxn << 1];
int head[maxn], e_num, n, m, vis[maxn], d[maxn], deg[maxn];
std::vector<int> vec[3];
inline void add_edge(int from, int to)
{
e[++e_num] = (edge) {head[from], to};
head[from] = e_num, ++deg[to];
} void Set(int x)
{
vis[x] = 0; if (!d[x]) d[x] = 1;
for (int i = head[x]; i; i = e[i].next)
if (vis[e[i].to]) Set(e[i].to);
} int findCir(int x, int f)
{
vis[x] = 1;
for (int i = head[x]; i; i = e[i].next)
if (!vis[e[i].to]) { if (findCir(e[i].to, x)) return 1; }
else if (e[i].to != f) return 1;
return 0;
} int findDeg(int x, int f)
{
if (f && deg[x] == 3) return d[x] = 2, 1;
for (int i = head[x]; i; i = e[i].next)
if (e[i].to != f) if (findDeg(e[i].to, x)) { d[x] = 2; return 1; }
return 0;
} void dfs(int x, int f, std::vector<int> &v)
{
v.push_back(x);
for (int i = head[x]; i; i = e[i].next)
if (e[i].to != f) dfs(e[i].to, x, v);
} int main()
{
for (int T = read(); T--; )
{
n = read(), m = read();
memset(head, 0, (n + 1) << 2), memset(vis, 0, (n + 1) << 2);
memset(d, 0, (n + 1) << 2), memset(deg, 0, (n + 1) << 2), e_num = 0;
for (int i = 1, a, b; i <= m; i++)
a = read(), b = read(), add_edge(a, b), add_edge(b, a);
int f = 0;
for (int i = 1; !f && i <= n; i++)
if (!vis[i]) if ((f = findCir(i, 0))) Set(i);
for (int i = 1; !f && i <= n; i++)
if (deg[i] > 3) { d[i] = 2, Set(i), f = 1; }
for (int i = 1; !f && i <= n; i++)
if (deg[i] == 3) if ((f = findDeg(i, 0)))
memset(vis, 1, sizeof vis), Set(i);
for (int i = 1; !f && i <= n; i++) if (deg[i] == 3)
{
int cur = 0; vec[0].clear(), vec[1].clear(), vec[2].clear();
for (int j = head[i]; j; j = e[j].next) dfs(e[j].to, i, vec[cur++]);
if (vec[0].size() > vec[1].size()) std::swap(vec[0], vec[1]);
if (vec[0].size() > vec[2].size()) std::swap(vec[0], vec[2]);
if (vec[1].size() > vec[2].size()) std::swap(vec[1], vec[2]);
if (vec[1].size() == 1 || (vec[0].size() == 1 && vec[1].size() == 2
&& vec[2].size() < 5)) continue;
f = 1;
if (vec[2].size() >= 5)
{
d[i] = 6, d[vec[0][0]] = 3, d[vec[1][0]] = 4, d[vec[1][1]] = 2;
for (int j = 0; j < 5; j++) d[vec[2][j]] = 5 - j;
}
else
{
d[i] = (vec[0].size() + 1) * (vec[1].size() + 1) * (vec[2].size() + 1);
for (int j = 0; j < 3; j++) for (int k = 0; k < (int) vec[j].size(); k++)
d[vec[j][k]] = d[i] / (vec[j].size() + 1) * (vec[j].size() - k);
}
}
if (!f) { puts("NO"); continue; } puts("YES");
for (int i = 1; i <= n; i++) printf("%d%c", d[i], " \n"[i == n]);
}
return 0;
}

CF830E Perpetual Motion Machine的更多相关文章

  1. Thinking Clearly about Performance

    http://queue.acm.org/detail.cfm?id=1854041 The July/August issue of acmqueue is out now acmqueue is ...

  2. unity5之代码创建状态机,玩的666

    http://blog.csdn.net/litaog00/article/details/50483189 最近做项目的时候用到了状态机,网上搜了一下帖子,大部分都是简单介绍使用方法的,讲解的详细的 ...

  3. Machine and Deep Learning with Python

    Machine and Deep Learning with Python Education Tutorials and courses Supervised learning superstiti ...

  4. Motion control encoder extrapolation

    Flying Saw debug Part1 Encoder extrapolation Machine introduction A tube cutting saw, is working for ...

  5. booklist for machine learning

    Recommended Books Here is a list of books which I have read and feel it is worth recommending to fri ...

  6. [C5] Andrew Ng - Structuring Machine Learning Projects

    About this Course You will learn how to build a successful machine learning project. If you aspire t ...

  7. Pattern Recognition and Machine Learning-02-1.0-Introduction

    Introduction The problem of searching for patterns in data is a fundamental one and has a long and s ...

  8. New Machine Learning Server for Deep Learning in Nuke(翻译)

    最近一直在开发Orchestra Pipeline System,歇两天翻译点文章换换气.这篇文章是无意间看到的,自己从2015年就开始关注机器学习在视效领域的应用了,也曾利用碎片时间做过一些算法移植 ...

  9. 【Machine Learning】KNN算法虹膜图片识别

    K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

随机推荐

  1. mac上使用git命令上传项目工程源码至Github/gitee

    原文连接:(http://www.studyshare.cn/blog/details/1164/0 ) 一.安装git工具 1.官网下载地址:点击下载  安装步骤略,mac安装工具双击拖动即可. 2 ...

  2. NMS(non maximum suppression,非极大值抑制)

    """nms输入的数据为box的左上角x1,y1与右下角x2,y2+confidence,rows=batch_size,line=[x1,y1,x2,y2,confid ...

  3. AVI文件格式

    AVI文件采用的是RIFF文件结构方式.波形音频wave,MIDI和数字视频AVI都采用这种格式存储. AVI文件的整体结构如下图所示 构造RIFF文件的基本单元叫做数据块(Chunk),每个数据块包 ...

  4. 使用jmeter对dubbo接口进行性能测试教程及常见问题处理

    一.   测试脚本编写 脚本可参考git项目: https://github.com/aland-1415/dubbo-interface-test.git 1. pom依赖 (注意添加的jmeter ...

  5. Java知识回顾 (18)Java 8、9、11的新特性

    Java 8 Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本. Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 Jav ...

  6. python关于try except的使用方法

    一.常见错误总结 AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x IOError 输入/输出异常;基本上是无法打开文件 ImportError 无法引入 ...

  7. 【书评:Oracle查询优化改写】第二章

    [书评:Oracle查询优化改写]第二章 BLOG文档结构图 在上一篇中http://blog.itpub.net/26736162/viewspace-1652985/,我们主要分析了一些单表查询的 ...

  8. JWT生成token及过期处理方案

    业务场景 在前后分离场景下,越来越多的项目使用token作为接口的安全机制,APP端或者WEB端(使用VUE.REACTJS等构建)使用token与后端接口交互,以达到安全的目的.本文结合stacko ...

  9. Mac电脑永久路由的添加方法是是什么? Mac校园网连接教程

    学校校园网面向全校师生开放,无奈Windows用户基数大,学校只为Windows平台制作了内网连接工具,Mac平台资源较少,本人查阅相关资料后,总结整理出以下步骤,方便本校学生连接校园网. 有永久路由 ...

  10. 【笔记】Reptile-一阶元学习算法

    目录 论文信息 Nichol A , Achiam J , Schulman J . On First-Order Meta-Learning Algorithms[J]. 2018. 一.摘要 本文 ...