题意:n(2^16)个点组成的森林 给出每个点的度以及相邻点的异或和 求 输出所有边
枚举每一种情况;
如果X的度数为1,则相邻点的异或值就是与X相邻点Y;直接输出;
然后跟新X与Y的度数与它们周围的异或值;然后判断Y点;如Y度数不为1,则返回,继续枚举;
#include<bits/stdc++.h>
using namespace std;
#define ll long long int
ll a[65540],b[65540];
ll n;
void f(ll i)
{
if(a[i]!=1)
return;
ll c=b[i];
cout<<i<<" "<<c<<endl;
a[c]--;b[c]=b[c]^i;
a[i]--;b[i]=b[i]^c;
f(c);
}
int main()
{
ll i,x=0;
cin>>n;
for(i=0;i<n;i++)
{
cin>>a[i]>>b[i];
x+=a[i];
}
cout<<x/2<<endl;
for(i=0;i<n;i++)
{
f(i);
}
}