补题链接: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. Vue打包发布

    打包发布 目标:明确打包的作用 说明:vue脚手架只是开发过程中,协助开发的工具,当真正开发完了,脚手架不参与上线 打包的作用: 将多个文件压缩合并成一个文件 语法降级 less sass ts 语法 ...

  2. 2019-2020 ICPC Southwestern European Regional Programming Contest (SWERC 2019-20) L题(SG+状压)

    题意:给定一个N*N的表格,其上有三种类型的方格:坚实的地面.潮湿的区域和保护区.连通的湿区方格形成湿区,当两个正方形共用一条边时,它们被认为是连接的.每个湿区必须连接到网格的左右两侧,并且不包含超过 ...

  3. Java 21 官方速览:全面拥抱虚拟线程

    前言 首先,感谢一下不少xdm私信关心我的身体状况,我也不是什么厉害的大佬,点开通知看到一堆私信还是蛮感动的. 近来有意大幅缩短了更新频率,增加了日常调养身体的时间,淋巴结确实变小了,睡眠也逐渐正常, ...

  4. MySQL大表设计怎么做?

    MySQL是一种常用的关系型数据库管理系统,它在处理大表时需要特别注意设计和优化.下面将详细介绍MySQL大表的设计原则和优化策略. 1. 数据库设计 数据库范式化:将数据按照规范的关系模型进行拆分和 ...

  5. C#/.NET/.NET Core优秀项目和框架2023年11月简报

    前言 公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(公众号每周至少推荐两个优秀的项目和框架当然节假日除外),公众号推文有项目和框架的介绍.功能特点以及部分截图等(打不开或 ...

  6. AtCoder_abc328

    A - Not Too Hard 题目链接 题目大意 给出\(N\)个数(\(S_1\) \(S_2\)...\(S_n\))和一个\(X\),输出所有小于等于\(X\)的\(S_i\)之和 解题思路 ...

  7. Go语言实现GoF设计模式:适配器模式

    本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:适配器模式>,作者:元闰子. 简介 适配器模式(Adapter)是最常用的结构型模式之一,在现实生活中,适配器模式也是处处可见 ...

  8. 媒体img组件以及swiper轮播

    .swiper{        height: 400rpx;        margin-top: 100rpx;        .item{            padding: 20rpx;  ...

  9. Gradle构建微服务项目

    先说一下初衷把:为啥突然要用Gradle,公司后期自研项目都使用Gradle构建...... 1.下载安装 这个就不说了,网上大家搜索一下,配置一下环境变量即可 2.Groovy的一些语法Gradle ...

  10. Oracle重做、归档日志

    日志文件 oracle日志文件分为两种: 重做日志文件(redo),或者称为"在线重做日志" 归档日志文件(arch),或者称为"归档重做日志" 在线重做日志文 ...