码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #285 Div1 A and Div2 C

时间:2015-01-13 08:59:35      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:图论   拓扑排序   异或和   

Codeforces Round #285 Div1 A and Div2 C
Problem
  给一个图G,保证G是一个森林(坑!)。图G含有N个点,给出每个点的两个属性:度数(degree)、异或和(sum)。度数表示该点与多少个点相连,异或和表示与其相连的点的编号的异或和(点编号从0开始,若度数为0则异或和为0)。要求求出原图,输出边的个数和每条边两端的顶点。

Limits
Time Limit(ms): 1000
Memory Limit(MB): 256
N: [1, 2^16]
degree: [0, N-1]

Solution
  由于G是森林,G的每一个连通图一定是一棵树,树一定无环无回路,可拓扑排序。按照拓扑排序的方法,不断维护点的度数和异或和,适当入队列,即可解。

More
  起初将入度为1的结点入队列,每次从队列中取出点(不妨假设为now),now的度数一定不超过1,若为1,那么其异或和(sum)一定是与其相连的点的编号(不妨假设为to);将to的异或和sum与now进行运算(sum^=now),再将to的度数减一,若减一后to的度数变为1,则入队列。如此循环,直到队列为空。每次的now和to则为一条边的两端顶点。

Complexity
Time Complexity: O(N)
Memory Complexity: O(N)

Source

Code


Codeforces Round #285 Div1 A and Div2 C

标签:图论   拓扑排序   异或和   

原文地址:http://blog.csdn.net/uestc_peterpan/article/details/42669417

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!