正题

题目链接:https://loj.ac/p/3130


题目大意

给出nnn个点mmm条边的一张有权无向图,你每次可以选择一个边集异或上一个值,要求最少次数使得所有简单环异或和都为000。

1≤n,m≤1051\leq n,m\leq 10^51≤n,m≤105


解题思路

先找一棵生成树,然后每条非树边都会产生一个简单环,显然这些简单环合法了其他的也一定合法。

而肯定存在一种最优的方案是只改非树边,因为如果该树边首先我们可以一次改一个集合所有必须改一条树边会对多个简单环产生不同的影响,而如果我们异或的是valvalval,那么我们能做到的只是让某个简单环异或上valvalval(奇数条树边操作),或者不异或上valvalval(偶数条树边操作),所以是和我们操作非树边能做到的是相同的。

那么问题就变为已知一些数要异或多少,求最少操作次数了,我们用线性基求出最小的线性空间就好了。

时间复杂度:O(n+mlog⁡m)O(n+m\log m)O(n+mlogm)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define mp(x,y) make_pair(x,y)
using namespace std;
const int N=1e5+10;
struct node{int to,next,w;
}a[N<<1];
int n,m,tot,k,w[N],d[N],ls[N],v[N];
bool vis[N];
void addl(int x,int y,int w){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;a[tot].w=w;return;
}
void dfs(int x,int fa){vis[x]=1;for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==fa)continue;if(vis[y]){if(i&1)v[(i+1)/2]=w[x]^w[y]^a[i].w;}else{w[y]=w[x]^a[i].w;dfs(y,x);}}return;
}
void ins(int x){for(int i=29;i>=0;i--)if((x>>i)&1){if(d[i])x^=d[i];else {d[i]=x;k+=(x!=0);break;}}return;
}
int main()
{scanf("%d%d",&n,&m);for(int i=1,x,y,w;i<=m;i++){scanf("%d%d%d",&x,&y,&w);addl(x,y,w);addl(y,x,w);}dfs(1,0);for(int i=1;i<=m;i++)ins(v[i]);printf("%d\n",k);for(int i=0;i<=29;i++)if(d[i]){int cnt=0;for(int j=1;j<=m;j++)cnt+=((v[j]>>i)&1);printf("%d %d ",d[i],cnt);for(int j=1;j<=m;j++)if((v[j]>>i)&1)printf("%d ",j);putchar('\n');}return 0;
}

Loj#3130-「COCI 2018.12」Praktični【线性基】相关推荐

  1. Loj #2324. 「清华集训 2017」小 Y 和二叉树

    Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...

  2. [LOJ#522]「LibreOJ β Round #3」绯色 IOI(危机)

    [LOJ#522]「LibreOJ β Round #3」绯色 IOI(危机) 试题描述 IOI 的比赛开始了.Jsp 和 Rlc 坐在一个角落,这时他们听到了一个异样的声音 -- 接着他们发现自己收 ...

  3. [LOJ#2329]「清华集训 2017」我的生命已如风中残烛

    [LOJ#2329]「清华集训 2017」我的生命已如风中残烛 试题描述 九条可怜是一个贪玩的女孩子. 这天她在一堵墙钉了 \(n\) 个钉子,第 \(i\) 个钉子的坐标是 \((x_i,y_i)\ ...

  4. loj #6226. 「网络流 24 题」骑士共存问题

    #6226. 「网络流 24 题」骑士共存问题 题目描述 在一个 n×n\text{n} \times \text{n}n×n 个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上某些 ...

  5. [LOJ #521]「LibreOJ β Round #3」绯色 IOI(抵达)(结论)

    #521. 「LibreOJ β Round #3」绯色 IOI(抵达) description solution 因为点的庇护所不能为自身,题目背景在树上,有结论一定是两个相邻点互为庇护所 所以树一 ...

  6. loj #535. 「LibreOJ Round #6」花火 树状数组求逆序对+主席树二维数点+整体二分...

    $ \color{#0066ff}{ 题目描述 }$ 「Hanabi, hanabi--」 一听说祭典上没有烟火,Karen 一脸沮丧. 「有的哦-- 虽然比不上大型烟花就是了.」 还好 Shinob ...

  7. loj #6004. 「网络流 24 题」圆桌聚餐(最大流)

    #6004. 「网络流 24 题」圆桌聚餐 内存限制:256 MiB时间限制:5000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数 ...

  8. LOJ#2833 「JOISC 2018 Day 1」帐篷 dp

    题目描述 译自 JOISC 2018 Day1 T3「テント / Tents」 JOI 君经营着一座露营地.露营地被划分为 H 行 W 列的矩阵,各行平行于东西方向,而各列平行于南北方向.从北向南数第 ...

  9. @loj - 6353@「CodePlus 2018 4 月赛」组合数问题 2

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 请你找到 k 个不同的组合数,使得对于其中任何一个组合数 \(C ...

最新文章

  1. 关于并发处理,下列哪些说法符合《阿里巴巴Java开发手册》
  2. 温网停赛,AI不停赛:斯坦福新研究模拟网球名将打比赛
  3. 不得不为LINQ说几句话,驳“LINQ已死”论
  4. 1521 error1
  5. 智能车竞赛技术报告 | 智能车视觉 - 温州大学- 春华秋实
  6. 万能的BERT连文本纠错也不放过
  7. linux QT 结束当前进程_嵌入式linux编程开发必备知识
  8. 吐血推荐泛绿色编程工具: EditPlus 已于 2010-07-14 升级到 v3.12(602)
  9. tensorflow python3编程_PixelCNN++实现:基于 Python3 和 TensorFlow
  10. STM8L101+si4463低功耗和自动唤醒配置
  11. ad7705c语言程序,基于51单片机的的AD7705的运用
  12. 常用的办公软件有哪些?
  13. 10Redis--主从复制 非常重要、一主二仆、薪火相传、反客为主、哨兵模式
  14. 安装qq提示IE浏览器版本低
  15. 计算机科学与技术专业实践范文,计算机科学与技术专业毕业实习报告范文.docx...
  16. Clustering by Passing Messages Between Data Points(Brendan J.Frey* and Delbert Dueck)例子
  17. swoole 解决tcp粘包问题
  18. 乐视体育TV版首发当贝市场 适配多数互联网电视及盒子
  19. Appium+Python实现自动投递Boss直聘简历
  20. 更换ubuntu软件源为阿里源,解决ubuntu下载安装软件慢的问题并安装open-vm-tools和open-vm-tools-desktop

热门文章

  1. android技术积累,Android开发中积累的一些报错的解决方法
  2. abap al设置单元格可编辑 oo_润乾报表美化设置 -- 样式
  3. api中文文档 mws_中英文排版规范化 API
  4. php 图片 3d旋转图片,html5实现图片的3D旋转效果
  5. js vue中得延时器_Vue.js实现时分秒倒计时
  6. tableau三轴合并_《Tableau数据可视化实战》——1.12节合并不同数据源-阿里云开发者社区...
  7. linux如何使用vnc远程登录,如何使用Xmanager及VNC登录远程桌面
  8. 吴恩达DeepLearningCourse5-序列模型
  9. C++重载运算符小结与注意点
  10. C++ class实现链队列(完整代码)