题目链接: C. Misha and Forest
题目大意:
给你一个无环无重边的图,给出每个顶点的与其相连的点的个数和这个顶点与之相连的点的编号的异或值(比如和与2相连的是3和5和7 这个值就是3^5^7,如果只有一个就是相连的点的编号)从度为1 的点入手,说明他是叶节点,他的异或值就是与之相连的边的编号,就能求出这条边。逐步递推上去,就能求出所有边。异或的公式x^y=sum,y=sum^x。
#include<iostream>
#include<queue>
using namespace std;
int degree[100000], sum[1000000];
typedef queue<int> Q;
Q q;
int main()
{
int n,i,ans=0;
cin >> n;
for (i = 0; i < n; ++i)
{
cin >> degree[i] >> sum[i];
if (degree[i] == 1)q.push(i);
ans += degree[i];
}
cout << ans / 2 << endl;
while (!q.empty())
{
int l = q.front();
q.pop();
//入队后有可能度为0
if (degree[l] == 0)continue;
int r = sum[l];
//这条边输出后对应的点的度要减少1 然后异或值倒推上去
degree[l]--;
degree[r]--;
sum[r] ^= l;
if (degree[r] == 1)q.push(r);
cout << l << " " << r << endl;
}
return 0;
}