題意:給一個森林,有n個點編號爲0~n-1,告訴每個點的度數,和所有與他連邊的結點編號的異或和,問這個森林是什麼樣子,輸出邊。
思路:
從葉子結點考慮,葉子結點的異或和的值就是與它連邊的點的編號,然後那個點的度數減一,重複這樣操作。
AC代碼:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<string>
#include<vector>
using namespace std;
typedef long long ll;
const int maxn=100000;
queue<int> q;
int u[maxn],v[maxn],tot=0,n,in[maxn],val[maxn];
int main(){
cin>>n;
for(int i=0;i<n;i++){
scanf("%d%d",&in[i],&val[i]);
if(in[i]==1) q.push(i);
}
while(!q.empty()){
int nn=q.front();
q.pop();
if(in[nn]==0)continue;
u[tot]=nn;
v[tot++]=val[nn];
val[val[nn]]^=nn;
in[val[nn]]--;
if(in[val[nn]]==1) q.push(val[nn]);
}
printf("%d\n",tot);
for(int i=0;i<tot;i++)printf("%d %d\n",u[i],v[i]);
return 0;
}