Bitwise Exclusive-OR Sequence 异或,dfs,菊花图(2021.11.沈阳)
题意 :
- 给n个点,m条边,每条边的边权为w,是其连边两点的异或和,求出满足题意的图的最小点权和,如果不存在这样的图则输出-1
思路 :
- 异或的传递性质 :有a⊕b=x,b⊕c=ya \oplus b = x, b \oplus c = ya⊕b=x,b⊕c=y,则a⊕c=x⊕ya \oplus c = x \oplus ya⊕c=x⊕y;推论 :有a1⊕a2=w1.a2⊕a3=w2,...a_1 \oplus a_2 = w_1. a_2 \oplus a_3 = w_2,...a1⊕a2=w1.a2⊕a3=w2,...,则a1⊕an=w1⊕w2⊕...⊕wn−1a_1 \oplus a_n = w_1 \oplus w_2 \oplus ... \oplus w_{n-1}a1⊕an=w1⊕w2⊕...⊕wn−1
- 异或的转换性质 :有a⊕b=ca \oplus b = ca⊕b=c,则a⊕c=ba \oplus c = ba⊕c=b
- 结合以上两个性质 :有an=a1⊕w1⊕w2⊕...⊕wn−1a_n=a_1 \oplus w_1 \oplus w_2 \oplus ... \oplus w_{n-1}an=a1⊕w1⊕w2⊕...⊕wn−1,也就是每一块连通区域内的其他任意点的点权与基点的点权的dfs关系
- 考虑本题,根据题意建图,考虑每一块连通区域,若合法,则只需对其中任意一点确定权值,则能确定连通块中每一点的权值,并且任选其中一个点为该连通块的基点,能确定该连通块内任何一点与基点的异或和
- 因此,我们可以从1开始对所有未经过的点dfs,dfs过程中若某点已经被访问过且无法拥有唯一确定点权(成环了),则输出-1,且退出遍历,否则在dfs过程中建立以本次dfs基点为中心的菊花图,边权为基点与目标点连边的异或和
- 对每个建的新连通块,基点的每一位都可以枚举0和1两种情况,取更小的(dfs时我们假设基点是000…0,如果某一位上这个连通区域内1的个数大于0的个数,基点的这一位就放1,因为原先异或性质导致一条边的两个端点同一位肯定是同时变化的),统计当前连通区域点权和时,已经确定连通块基点点权为x,当前该点在基点为全0时取的是f[v],考虑某一位,x现在仍是0,该点如果原先是0,现在也是0,该点如果原先是1,现在也是1;x现在如果是1,该点如果原先是0,现在应是1,该点如果原先是1,现在是0,所以累加答案是f[v]⊕xf[v] \oplus xf[v]⊕x
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <unordered_set>
#include <math.h>
#define endl '\n'
#define fi first
#define se second
#define pb push_backusing namespace std;
using ll = long long;typedef pair<int, int> PII;const int N = 1e5 + 10;int n, m;
bool flag = true;
vector<PII> g[N];
vector<int> res[N];
int f[N];
bool st[N];void dfs(int u, int lt)
{st[u] = true;for (auto pii : g[u]){int v = pii.fi, w = pii.se;if (st[v]){if (f[v] != (f[u] ^ w)){flag = false;return ;}}else{f[v] = (f[u] ^ w);res[lt].pb(v);dfs(v, lt);}}
}ll add(int lt)
{int x = 0;for (int i = 0; i < 30; i ++ ){int cnt = 0;for (auto u : res[lt])if (f[u] >> i & 1) cnt ++ ;if (cnt > res[lt].size() / 2) x += (1 << i);}ll ans = x;for (auto u : res[lt]) ans += x ^ f[u];return ans;
}int main()
{cin.tie(nullptr) -> sync_with_stdio(false);int n, m; cin >> n >> m;for (int i = 0, u, v, w; i < m; i ++ ){cin >> u >> v >> w;g[u].pb({v, w}); g[v].pb({u, w});}ll ans = 0;for (int i = 1; i <= n; i ++ ){if (!st[i] && flag){dfs(i, i);ans += add(i);}}cout << (flag ? ans : -1) << endl;return 0;
}
Bitwise Exclusive-OR Sequence 异或,dfs,菊花图(2021.11.沈阳)相关推荐
- CodeForces1477D Nezzar and Hidden Permutations(构造+调整+菊花图)
problem 洛谷链接 题意:给定 mmm 条形如 (u,v)(u,v)(u,v) 的限制,要求 au,ava_u,a_vau,av 的相对大小关系与 bu,bvb_u,b_vbu,bv 相 ...
- DFS遍历图时的小技巧
DFS遍历图时的小技巧 我们通常使用DFS遍历图时,用vis[i]=true;来标记访问过的节点,但是如果要让我们统计图中所有边的长度的话,如果我们还这样做的话,对于非环形图来说,没问题,但是对于环形 ...
- 安卓设置菊花动画_Android仿ios加载loading菊花图效果
项目中经常会用到加载数据的loading显示图,除了设计根据app自身设计的动画loading,一般用的比较多的是仿照ios 的菊花加载loading 图,当然一些条件下还会涉及到加载成功/ 失败情况 ...
- DFS求图的连通分支、割点数、判断是否连通
连通分支数 /*DFS求图的连通分支数 */ #include <stdio.h> #define N 1 //看是否所有顶点都被访问标记过 int IsVisit(int visit[] ...
- 安卓设置菊花动画_Android 加载菊花图 自定义
本来想找一个ios的菊花加载图旋转一下搞定这个的,但是发现使用图片后由于图片的不对称导致动画时有抖动现象,不能忍,于是搜了下自定义菊花图,额,然后就没有然后了,都不是想要的,于是开始了苦逼的自定义Vi ...
- 2021牛客暑期多校训练营3 I-Kuriyama Mirai and Exclusive Or(异或+差分)
I-Kuriyama Mirai and Exclusive Or KeHe题解 diabolusexnihil题解 不过diabolusexnihil大佬的题解有一部分写错了应该是:每次分裂标记bl ...
- 【图的DFS】图的DFS非递归算法
在DFS的递归算法中,DFS框架如下: 1访问起点v0 2依次以v0的未访问的连接点为起点,DFS搜索图,直至图中所有与v0路径相通的顶点都被访问. 3若该图为非连通图,则图中一定还存在未被访问的顶点 ...
- [蓝桥杯][历届试题]网络寻路-dfs,图的遍历
题目描述 X 国的一个网络使用若干条线路连接若干个节点.节点间的通信是双向的.某重要数据包,为了安全起见,必须恰好被转发两次到达目的地.该包可能在任意一个节点产生,我们需要知道该网络中一共有多少种不同 ...
- python 拓扑排序 dfs bfs_图遍历算法之DFS/BFS
在计算机科学, 图遍历(Tree Traversal,也称图搜索)是一系列图搜索的算法, 是单次访问树结构类型数据(tree data structure)中每个节点以便检查或更新的一系列机制.图遍历 ...
最新文章
- oracle expdp 权限不足 1031,关于expdp,impdp操作需要的权限
- 数据结构复习—1.1
- 差分隐私 python_主要开发语言为 Python/Rust:微软与哈佛大学合作开源差分隐私平台...
- BAT大佬给的Python神器,内附资源
- HTTP GET与POST区别
- HTML5来到,原生Native APP是否还有市场
- 分布式系统事务一致性解决方案大对比,谁最好使?
- Spring中父子容器的实现实例
- Python基础(while循环/赋值运算符)
- linux windows死机,linux死机的处理方式
- oracle逗号分隔函数
- 《你不可不知的50个艺术知识》之抽象画
- Tough Days
- java中将zip文件解压到指定目录下
- TreeView 右键菜单
- 拜耳再投4亿元提升在华处方药产能;阿斯利康进博会公布新冠疫苗最新进展 | 美通企业日报...
- 软件工程导论E-R图、盒图(N-S图)、PAD图
- 信息奥赛一本通1225:金银岛
- K-Means(K-均值)聚类算法
- wps自动图文集 重新编号_如何使用自动图文集在Microsoft Word中快速插入文本块
热门文章
- LSMW批处理使用方法(08)_步骤8、9
- MRP清单的动态和静态ABAP的取法
- 根据SAP表名或视图查询后台配置路径
- Four ugliness
- 巧用参数组件和过滤组件,教你快速定位目标数据
- 快捷键截屏_QQ的Ctrl+Alt+A快捷键除了截屏,竟然还有这么多好用的功能!
- mysql的错误代码1064_mysql错误代码之1064的解决方案
- 台安变频器n2按键说明_台安变频器N2型号说明参数设置故障代码及故障解决方法...
- mysql的dml全,MySQL数据管理----DML语言(全记住)(示例代码)
- Django中提供了6种缓存方式,你会几种?