题意 :

  • 给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.沈阳)相关推荐

  1. 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​ 相 ...

  2. DFS遍历图时的小技巧

    DFS遍历图时的小技巧 我们通常使用DFS遍历图时,用vis[i]=true;来标记访问过的节点,但是如果要让我们统计图中所有边的长度的话,如果我们还这样做的话,对于非环形图来说,没问题,但是对于环形 ...

  3. 安卓设置菊花动画_Android仿ios加载loading菊花图效果

    项目中经常会用到加载数据的loading显示图,除了设计根据app自身设计的动画loading,一般用的比较多的是仿照ios 的菊花加载loading 图,当然一些条件下还会涉及到加载成功/ 失败情况 ...

  4. DFS求图的连通分支、割点数、判断是否连通

    连通分支数 /*DFS求图的连通分支数 */ #include <stdio.h> #define N 1 //看是否所有顶点都被访问标记过 int IsVisit(int visit[] ...

  5. 安卓设置菊花动画_Android 加载菊花图 自定义

    本来想找一个ios的菊花加载图旋转一下搞定这个的,但是发现使用图片后由于图片的不对称导致动画时有抖动现象,不能忍,于是搜了下自定义菊花图,额,然后就没有然后了,都不是想要的,于是开始了苦逼的自定义Vi ...

  6. 2021牛客暑期多校训练营3 I-Kuriyama Mirai and Exclusive Or(异或+差分)

    I-Kuriyama Mirai and Exclusive Or KeHe题解 diabolusexnihil题解 不过diabolusexnihil大佬的题解有一部分写错了应该是:每次分裂标记bl ...

  7. 【图的DFS】图的DFS非递归算法

    在DFS的递归算法中,DFS框架如下: 1访问起点v0 2依次以v0的未访问的连接点为起点,DFS搜索图,直至图中所有与v0路径相通的顶点都被访问. 3若该图为非连通图,则图中一定还存在未被访问的顶点 ...

  8. [蓝桥杯][历届试题]网络寻路-dfs,图的遍历

    题目描述 X 国的一个网络使用若干条线路连接若干个节点.节点间的通信是双向的.某重要数据包,为了安全起见,必须恰好被转发两次到达目的地.该包可能在任意一个节点产生,我们需要知道该网络中一共有多少种不同 ...

  9. python 拓扑排序 dfs bfs_图遍历算法之DFS/BFS

    在计算机科学, 图遍历(Tree Traversal,也称图搜索)是一系列图搜索的算法, 是单次访问树结构类型数据(tree data structure)中每个节点以便检查或更新的一系列机制.图遍历 ...

最新文章

  1. oracle expdp 权限不足 1031,关于expdp,impdp操作需要的权限
  2. 数据结构复习—1.1
  3. 差分隐私 python_主要开发语言为 Python/Rust:微软与哈佛大学合作开源差分隐私平台...
  4. BAT大佬给的Python神器,内附资源
  5. HTTP GET与POST区别
  6. HTML5来到,原生Native APP是否还有市场
  7. 分布式系统事务一致性解决方案大对比,谁最好使?
  8. Spring中父子容器的实现实例
  9. Python基础(while循环/赋值运算符)
  10. linux windows死机,linux死机的处理方式
  11. oracle逗号分隔函数
  12. 《你不可不知的50个艺术知识》之抽象画
  13. Tough Days
  14. java中将zip文件解压到指定目录下
  15. TreeView 右键菜单
  16. 拜耳再投4亿元提升在华处方药产能;阿斯利康进博会公布新冠疫苗最新进展 | 美通企业日报...
  17. 软件工程导论E-R图、盒图(N-S图)、PAD图
  18. 信息奥赛一本通1225:金银岛
  19. K-Means(K-均值)聚类算法
  20. wps自动图文集 重新编号_如何使用自动图文集在Microsoft Word中快速插入文本块

热门文章

  1. LSMW批处理使用方法(08)_步骤8、9
  2. MRP清单的动态和静态ABAP的取法
  3. 根据SAP表名或视图查询后台配置路径
  4. Four ugliness
  5. 巧用参数组件和过滤组件,教你快速定位目标数据
  6. 快捷键截屏_QQ的Ctrl+Alt+A快捷键除了截屏,竟然还有这么多好用的功能!
  7. mysql的错误代码1064_mysql错误代码之1064的解决方案
  8. 台安变频器n2按键说明_台安变频器N2型号说明参数设置故障代码及故障解决方法...
  9. mysql的dml全,MySQL数据管理----DML语言(全记住)(示例代码)
  10. Django中提供了6种缓存方式,你会几种?