传送门

Description

Let's define a forest as a non-directed acyclic graph (also without loops and parallel edges). One day Misha played with the forest consisting of n vertices. For each vertex v from 0 to n - 1 he wrote down two integers, degreev and sv, were the first integer is the number of vertices adjacent to vertex v, and the second integer is the XOR sum of the numbers of vertices adjacent to v (if there were no adjacent vertices, he wrote down 0).

Next day Misha couldn't remember what graph he initially had. Misha has values degreev and sv left, though. Help him find the number of edges and the edges of the initial graph. It is guaranteed that there exists a forest that corresponds to the numbers written by Misha.

Input

The first line contains integer n (1 ≤ n ≤ 216), the number of vertices in the graph.

The i-th of the next lines contains numbers degreei and si (0 ≤ degreei ≤ n - 1, 0 ≤ si < 216), separated by a space.

Output

In the first line print number m, the number of edges of the graph.

Next print m lines, each containing two distinct numbers, a and b (0 ≤ a ≤ n - 1, 0 ≤ b ≤ n - 1), corresponding to edge (a, b).

Edges can be printed in any order; vertices of the edge can also be printed in any order.

Sample Input

3
2 3
1 0
1 0

2
1 1
1 0

Sample Output

2
1 0
2 0

1
0 1

Note

The XOR sum of numbers is the result of bitwise adding numbers modulo 2. This operation exists in many modern programming languages. For example, in languages C++, Java and Python it is represented as "^", and in Pascal — as "xor".

思路

题意:

有一个森林包含0-n-1这n个节点,给出每个节点与它相邻节点的个数以及与它相邻节点的异或和,问有几条边,每条边的连接的两个节点是多少。

题解:

可以看作是一个拓扑排序,每次找出只有一个节点与之相邻的节点,那么与之相邻的节点的序号就是这个节点的异或和。

#include<bits/stdc++.h>
using namespace std;
const int maxn = (1<<16)+5;
int deg[maxn],sum[maxn]; int main()
{
int n;
queue<int>que;
scanf("%d",&n);
for (int i = 0;i < n;i++)
{
scanf("%d%d",&deg[i],&sum[i]);
if (deg[i] == 1) que.push(i);
}
vector<pair<int,int> >ans;
while (!que.empty())
{
int u = que.front();
que.pop();
if (deg[u] == 0) continue;
int v = sum[u];
ans.push_back(make_pair(u,v));
deg[v]--,sum[v] ^= u;
if (deg[v] == 1) que.push(v);
}
int size = ans.size();
printf("%d\n",size);
for (int i = 0;i < size;i++) printf("%d %d\n",ans[i].first,ans[i].second);
return 0;
}

  

最新文章

  1. test imetro
  2. Html特殊字符表
  3. 七个结构模式之外观模式(Facade Pattern)
  4. SVN分支研究
  5. Ubuntu16.04 操作
  6. C语言-09-文件操作
  7. nginx命令详解
  8. 第十四章 调试及安全性(In .net4.5) 之 对称及非对称加密
  9. 解决@media screen (自适应)IE浏览器不兼容问题
  10. iOS:(接口适配器3)--iPhone适应不同型号 6/6plus 前
  11. lambda 3
  12. linux系统设置cpu孤立
  13. 记录一次MyEclipse打开jsp文件出现Error的解决办法
  14. Iris数据集实战
  15. Python基础【day01】:Hello World程序(二)
  16. Cesium学习笔记(七):Demo学习(自由控制飞行的飞机)[转]
  17. ArchLinux安装 LXDE
  18. 关于SpringMVC整合freemarker报错问题
  19. orcal 数据库 maven架构 ssh框架 的全xml环境模版 及常见异常解决
  20. 201671010127 2016-2017-18 Java期末总结

热门文章

  1. (二:NIO系列) Java NIO Buffer
  2. React手稿 - Context
  3. AspNetCore使用MySQL
  4. document.body.scrollTop值为0的解决方法[转]
  5. Taro -- 上传图片公用组件
  6. CentOS7修改为国内yum源
  7. tac反向显示文件内容
  8. CSS3 结构性伪类选择器(1)
  9. element-ui 里面el-checkbox多选框,实现全选单选
  10. MyBatis 中的#和$的区别