bzoj 2115: [Wc2011] Xor
2016-04-24 16:22
453 查看
2115: [Wc2011] Xor
Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 2081 Solved: 868
[Submit][Status][Discuss]
Description
Input
第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目。 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 Di的无向边。 图中可能有重边或自环。Output
仅包含一个整数,表示最大的XOR和(十进制结果),注意输出后加换行回车。Sample Input
5 71 2 2
1 3 2
2 4 1
2 5 1
4 5 3
5 3 4
4 3 2
Sample Output
6HINT
Source
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #define N 700000 #define ll long long using namespace std; int n,m; int next ,tot=0,point ,u ,vis ,cnt,now; ll v ,val ,d ,bin[100]; void add(int x,int y,ll z) { tot++; next[tot]=point[x]; u[tot]=y; v[tot]=z; point[x]=tot; tot++; next[tot]=point[y]; u[tot]=x; v[tot]=z; point[y]=tot; } void dfs(int x) { vis[x]=1; for (int i=point[x];i;i=next[i]) if (!vis[u[i]]) { d[u[i]]=d[x]^v[i]; dfs(u[i]); } else val[++cnt]=d[x]^d[u[i]]^v[i]; } void gauss() { now=0; for (ll i=bin[60];i;i>>=1) { int j=now+1; while (j<=cnt&&!(val[j]&i)) j++; if (j==cnt+1) continue; now++; swap(val[now],val[j]); for (int k=1;k<=cnt;k++) if (k!=now&&(val[k]&i)) val[k]^=val[now]; } } int main() { bin[0]=1; for (int i=1;i<=60;i++) bin[i]=bin[i-1]<<1; scanf("%d%d",&n,&m); for (int i=1;i<=m;i++) { int x,y; ll z; scanf("%d%d%lld",&x,&y,&z); add(x,y,z); } dfs(1); gauss(); ll ans=d ; for (int i=1;i<=now;i++) ans=max(ans,ans^val[i]); printf("%lld\n",ans); }
相关文章推荐
- Java主要特性
- 电路设计(二)之串联匹配电阻的应用
- 内存-文件映射应注意的问题
- 启动页学习
- UVA_10667_Largest Block
- String作为函数参数时,传入的是值,不是地址
- 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
- Java中回调函数编写
- Windows-消息映射机制原理和简单的绘图技术
- Java中回调函数编写
- 左偏树的正确性和复杂度分析
- Android Studio 导入各种形式的三方库
- Huffman树&&Huffman编码(附完整源码)
- SIFT特征--方向赋值与关键点描述
- 文件读写函数 -- 字符串读写
- 八皇后问题,递归法
- Android ContentProvider基础
- 写论文第二天:验证交易策略
- 判断单链表是否有环的两种方法(转)
- iostat监控磁盘io