题意:
n(2^16)个点组成的森林 给出每个点的度以及相邻点的异或和 求 输出所有边
思路:
一道bfs的题目,从入度为一的点入手,因为入度为一的点,他的异或和就是与他相邻的那个点。
将所有的边存到一个结构体数组中
#include <iostream>
#include<cstring>
#include<queue>
using namespace std;
int n;
struct node
{
int a,b;
}ed[70000];
int d[70000],f[70000];
queue<int > q;
int main()
{
cin>>n;
int count=0;
for(int i=0;i<n;i++)
{
cin>>d[i]>>f[i];
if(d[i]==1)
q.push(i);
}
while(!q.empty())
{
int u=q.front();
q.pop();
if(d[u]!=1)//在bfs中入度可能改变
continue;
ed[count].a= u;
ed[count++].b= f[u];
f[f[u]]^=u;
d[f[u]]--;
if(d[f[u]]==1)
q.push(f[u]);
}
cout<<count<<endl;
for(int i=0;i<count;i++)
{
cout<<ed[i].a<<" "<<ed[i].b<<endl;
}
}