标签:算法 拓扑排序 codeforces
思路:类似一个拓扑排序的题,根据 对度数为1的点,它所连的边的编号即为异或和这一 规律,直接进行拓扑排序即可。
每次对得到的节点度数减一,并且异或上他所连的节点。
代码:
#include<cstdio> #include<cstring> #include<iostream> #include<vector> #include<algorithm> #include<queue> using namespace std; typedef long long LL; vector<int> G[66000]; int n,de[66000],sum[66000]; void solve() { queue<int> q; while(!q.empty()) q.pop(); for(int i=0;i<n;i++) if(de[i]==1) q.push(i); while(!q.empty()) { int xo=0; int v=q.front();q.pop(); if(de[v]!=1) continue; int u=sum[v]; sum[u]^=v,de[u]--; if(de[u]==1) q.push(u); printf("%d %d\n",v,u); } } int main() { //freopen("in.txt","r",stdin); int m=0; scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d%d",&de[i],&sum[i]); m+=de[i]; } printf("%d\n",m/2); solve(); return 0; }
Codeforces Round #285 (Div. 2) C - Misha and Forest
标签:算法 拓扑排序 codeforces
原文地址:http://blog.csdn.net/u014686462/article/details/42654545