补题链接:Here

思维不够,看到这种陌生的题目无从下手.

这题应该做过一次的人会觉得它其实并不难.

主要思想:把边权->点权.

这样做的好处是,无论你怎么分配点权,在环内的异或值一定为 \(0\) (前提是环内的一定合法.)

做题步骤也是围绕这些性质来的.

  1. 首先判断给定的点是否有矛盾,就是你给一个点赋值,它假如是环的话,有矛盾,那么它的异或值为 \(1\) .然后你这个点的异或值会和你之前给定它的异或值不同.
  2. 找有多少联通块,不同的联通块是独立事件,用乘法原理.然后点权的设置,其实本身存在重复,就是你把所有点取反和不取反,这两种情况的边权是一样的.然后本身没有限制,假设联通块大小是 \(k\) 那么就是\(2^k\) .去除重复就是 \(2^{k - 1}\)
  3. 考虑限制,一旦给一段连续的限制,你给头部元素赋值 \(1/0\) ,它这一段都是确定的,换句话来说,它这一段的贡献只有\(2\) 所以我们应该把之前多算的贡献消掉,假如这段联通块大小是 \(p\) ,那么我们必须把 \(ans/=2^{p-1}\)
using ll      = long long;
const int mod = 998244353;
const int N = 1e5 + 10;
vector<pair<int, int>> e[N]; // u,v,w
int color[N];
bool vis[N];
bool dfs0(int u, int col) {
color[u] = col;
for (auto v : e[u]) {
if (v.second == -1) continue;
if (color[v.first] != -1 and col ^ v.second != color[v.first]) return false;
if (color[v.first] == -1 and !dfs0(v.first, col ^ v.second)) return false;
}
return true;
}
int dfs(int u, bool f) {
int ans = 1;
vis[u] = true;
for (auto v : e[u]) {
if (f and v.second == -1) continue;
if (!vis[v.first]) ans += dfs(v.first, f);
}
return ans;
}
void solve() {
int n, m;
cin >> n >> m;
while (m--) {
int u, v, w;
cin >> u >> v >> w;
e[u].push_back({v, w});
e[v].push_back({u, w});
}
memset(color, -1, sizeof(color));
for (int i = 1; i <= n; ++i)
if (color[i] == -1) {
if (!dfs0(i, 1)) {
cout << "0\n";
return;
}
}
int k = 0;
for (int i = 1; i <= n; ++i)
if (!vis[i]) k += dfs(i, false) - 1;
memset(vis, false, sizeof vis);
for (int i = 1; i <= n; ++i)
if (!vis[i]) k -= dfs(i, true) - 1;
int ans = 1;
for (int i = 1; i <= k; ++i)
ans *= 2, ans %= mod;
cout << ans << '\n';
}

【每日一题】21.边的染色 (DFS连通图 + 思维)的更多相关文章

  1. CISP/CISA 每日一题 21

    CISSP 每日一题(答)What is the term that identifies data ona disk after the data has supposedly been erase ...

  2. 【每日一题】【树的dfs递归,返回多次,注意都遍历完后才最终返回】2022年1月6日-112. 路径总和

    给你二叉树的根节点 root 和一个表示目标和的整数 targetSum .判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum .如果存在,返回 tr ...

  3. [每日一题2020.06.08]洛谷P1605 DFS

    今天cf又杯具的只写出2题, 虽然AB题20分钟左右就搞定了, 但是CD写了2个小时也没写出来 D题我用到了DFS, 虽然必不正确, 但是我至少发现了一个问题, 那就是我连DFS都忘了, 于是怒找DF ...

  4. 【JavaScript】【dp】Leetcode每日一题-解码方法

    [JavaScript]Leetcode每日一题-解码方法 [题目描述] 一条包含字母 A-Z 的消息通过以下映射进行了 编码 : 'A' -> 1 'B' -> 2 ... 'Z' -& ...

  5. 老男孩IT教育-每日一题汇总

    老男孩IT教育-每日一题汇总 第几天 第几周 日期 快速访问链接 第123天 第二十五周 2017年8月25日 出现Swap file….already exists以下错误如何解决? 第122天 2 ...

  6. CISP/CISA 每日一题 九(2017-11-30 09:25)

    电子银行风险管理责任: 1.风险管理是董事会和高级管理层的责任 2.实施技术是信息技术高级管理层的责任 3.测量和监控风险是经营管理层的责任     管理层在实施一个新的电子银行应用程序之前要 ___ ...

  7. [每日一题]面试官问:for in和for of 的区别和原理?

    关注「松宝写代码」,精选好文,每日一题 ​时间永远是自己的 每分每秒也都是为自己的将来铺垫和增值 作者:saucxs | songEagle 一.前言 2020.12.23 日刚立的 flag,每日一 ...

  8. 【js】Leetcode每日一题-完成所有工作的最短时间

    [js]Leetcode每日一题-完成所有工作的最短时间 [题目描述] 给你一个整数数组 jobs ,其中 jobs[i] 是完成第 i 项工作要花费的时间. 请你将这些工作分配给 k 位工人.所有工 ...

  9. 【JavaScript】Leetcode每日一题-二叉搜索树的范围和

    [JavaScript]Leetcode每日一题-二叉搜索树的范围和 [题目描述] 给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和. 示例1: 输入: ...

  10. 【JavaScript】Leetcode每日一题-递增顺序搜索树

    [JavaScript]Leetcode每日一题-递增顺序搜索树 [题目描述] 给你一棵二叉搜索树,请你 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没 ...

随机推荐

  1. .NET 与 OpenEuler 共展翅,昇腾九万里

    openEuler 已支持 X86.ARM.SW64.RISC-V.LoongArch 多处理器架构,逐步扩展 PowerPC 等更多芯片架构支持,持续完善多样性算力生态体验. openEuler 社 ...

  2. 2. Shell 条件测试

    重点: 条件测试. read. Shell 环境配置. case. for. find. xargs. gzip,bzip2,xz. tar. sed. 1)位置 变量 位置变量:在 bash She ...

  3. 实现金蝶云星空与赛意SMOM系统的无缝数据对接

    1. 金蝶云星空:为运营协同与管控型企业提供通用ERP服务平台 金蝶云星空是基于当今先进管理理论和数十万家国内客户最佳应用实践开发的ERP服务平台.它针对事业部制.多地点.多工厂等企业和集团公司,提供 ...

  4. JAVAweek7

    本周学习[函数][数组] 什么是函数: 函数就是定义在类中的具有特定功能的一段独立小程序.函数也称为方法. 函数的格式: ·修饰符 返回值类型 函数名(参数类型 形式参数) { 执行语句: retur ...

  5. python循环语句(二)

    Python for循环可以遍历任何序列的项目,如一个列表或者一个字符串. 知识点:for循环的语法格式如下: for iterating_var in sequence: statements(s) ...

  6. Protobuf的使用,结合idea

    安装Protobuf并配置idea Protocol Buffers(又名 protobuf)是 Google 的中立语言, 平台中立.可扩展的结构化数据序列化机制. 官网: https://gith ...

  7. k8s安装Ingress-Nginx

    目前,DHorse(https://gitee.com/i512team/dhorse)只支持Ingress-nginx的Ingress实现,下面介绍Ingress-nginx的安装过程. 下载安装文 ...

  8. 安卓之各种Adapter优劣分析

    文章摘要 在 Android 开发中,适配器(Adapter)是一种非常重要的设计模式,它用于将数据与视图组件进行绑定.适配器可以帮助我们在不同的视图组件(如 ListView.GridView.Re ...

  9. 三个月我迁移了100PB数据

    2023年马上结束,这一年做了不少事情,有一项我可以吹好几年,忍不住和大家分享一下啊. 需求 去年底收到一项需求,要求2个月内从某云存储迁移100PB数据到微软云存储,包含几百亿个文件.当时听到这个数 ...

  10. STM32CubeMX教程11 RTC 实时时钟 - 入侵检测和时间戳

    使用STM32CubeMX软件配置STM32F407开发板RTC实现入侵检测和时间戳功能,具体为周期唤醒回调中使用串口输出当前RTC时间,按键WK_UP存储当前RTC时间到备份寄存器,按键KEY_2从 ...