题目链接:点击查看

题目大意:给出一个无环无向图,但给出的形式是只给出每个节点的度数以及所有相邻节点的异或和,要求我们还原出原图,表示出每条边即可

题目分析:既然是无环无向图,那么题目给出的就是一棵树了,既然涉及到了度数,并且还是一棵树,那么我们就可以利用拓扑排序的思想对这个题目进行处理,也就是一开始首先对于度数为1的节点进行处理,度数为1的节点肯定是叶子结点,那么与之相邻的节点的异或和,就是他的父节点了,找到父节点和叶节点之后,将两个端点的度数都减一,这样每次对于最边缘的叶子结点进行操作后,新的叶子节点就会露出来,如此以往就能从外向内遍历整棵树了,最后就将整棵树还原出来了,不过这个题目注意一下拓扑排序的内部实现,有一个小细节我没有注意到,导致一开始在test36WA了一发,就有点自闭,那就是注意判断每次进行操作的节点是否属于叶子节点,如果不是叶子结点直接continue即可,没有操作的必要了,记得特判一下,因为可能有与他相邻的边,在与其操作后改变了他的度数

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
#include<unordered_map>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e5+100;int n;vector<pair<int,int>>ans;int du[N],Xor[N];void solve()
{queue<int>q;for(int i=0;i<n;i++)if(du[i]==1)//先将最外层的叶子节点加入队列q.push(i);while(!q.empty()){int u=q.front();q.pop();if(du[u]!=1)//如果当前节点不是叶子节点,那么直接continuecontinue;ans.push_back(make_pair(u,Xor[u]));//将叶子节点与其父亲建边du[u]--;//更新度数du[Xor[u]]--;Xor[Xor[u]]^=u;//更新异或和if(du[Xor[u]]==1)//如果在处理完当前节点后,其父亲节点变成了叶子结点,那么继续加入队列中处理q.push(Xor[u]);}
}int main()
{
//  freopen("input.txt","r",stdin);scanf("%d",&n);for(int i=0;i<n;i++)scanf("%d%d",&du[i],&Xor[i]);solve();printf("%d\n",ans.size());for(int i=0;i<ans.size();i++)printf("%d %d\n",ans[i].first,ans[i].second);return 0;
}

CodeForces - 501C Misha and Forest(拓扑排序)相关推荐

  1. 【CodeForces - 214C 】Game (拓扑排序,思维)

    题干: Furik and Rubik love playing computer games. Furik has recently found a new game that greatly in ...

  2. codeforces 1635E-Cars (二分图染色+拓扑排序)

    传送门 difficult:2200difficult:2200difficult:2200 题意 数轴上存在 nnn 辆车和 mmm 个限制,每个限制以 opopop.uuu.vvv 的形式表示,其 ...

  3. Codeforces 1635 E. Cars 二分图+拓扑排序

    link 题意: 坐标轴有两辆车 1第一种相向而行 2 第二种相背而行 先二分图跑出来他的方向 如果不符合直接no 再根据他的拓扑关系跑一边拓扑排序 (开了ios)输出就乱码!!!!这就是cf吧 #i ...

  4. 【CodeForces 1100E】二分答案 | 拓扑排序 | E

    这是一道很美妙的题- 1100E. Andrew and Taxi time limit per test: 2 seconds memory limit per test: 256 megabyte ...

  5. CodeForces - 1463E Plan of Lectures(拓扑排序+并查集缩点)

    题目链接:点击查看 题目大意:给出一棵有根树,树边都是有向边,再给出 kkk 个关系 (x,y)( x , y )(x,y),其意义是访问完点 xxx 后需要立即访问点 yyy,问是否存在一种合适的拓 ...

  6. 【打CF,学算法——三星级】CodeForces 615B Longtail Hedgehog (DFS/拓扑排序)

    [CF简介] 提交链接:CF 615B 题面: B. Longtail Hedgehog time limit per test 3 seconds memory limit per test 256 ...

  7. Codeforces 504 A (Round #285 div.1 A) Misha and Forest

    Codeforces Round #285 (Div.1) A Misha and Forest 水题水题水-- 题意:给你一些点,给出他们连通了多少个点以及这些点的下标的异或值,让你找出一个图 题解 ...

  8. CodeForces - Kitchen Plates(拓扑排序)

    题目链接:http://codeforces.com/gym/102219/problem/J Time limit per test 1.0 s Memory limit per test 256 ...

  9. CodeForces 1213F (强联通分量分解+拓扑排序)

    传送门 •题意 给你两个数组 p,q ,分别存放 1~n 的某个全排列: 让你根据这两个数组构造一个字符串 S,要求: (1)$\forall i \in [1,n-1],S_{pi}\leq S _ ...

最新文章

  1. oracle 和 ' 特殊字符处理
  2. 《NoSQL精粹》思维导图读书笔记
  3. 原型、原型对象、构造函数、原型链理解
  4. Linux命令之du命令df命令
  5. 在JAVA语言程序中main_在Java程序main方法中,正确的参数是
  6. mysql数据库的体系结构包括什么组件_MySQL数据库的体系结构
  7. 程序员面试金典 - 面试题 16.15. 珠玑妙算(map计数)
  8. 在存储器的层次结构里,谁最快,谁最贵,谁最大?
  9. C#中相同不同程序集存在相同的命名空间的时候的冲突解决办法
  10. jq 直接调用php文件_PHP性能分析工具,你在用哪一个?
  11. Tomcat局域网多端口建立多网站
  12. SignalR---DOTNET客户端
  13. Redis源码阅读 (深入理解字符串)
  14. eCognition易康导出样本
  15. 进程调度优先数 c语言,进程调度--动态优先数法(C语言实现)
  16. 五险一金,这篇就够了
  17. 某些特殊悼念日的时候,让个人网页风格变黑灰色
  18. 修改vue项目到服务器端渲染,现有vue-cli3搭建的vue项目改ssr服务器渲染
  19. 微信小程序授权登录和账号登录
  20. 淘宝面试的几个算法题

热门文章

  1. 搭建K8s集群(kubeadm方式)-操作系统初始化
  2. 消息中间件的背景分析
  3. 分布式架构的负载均衡算法
  4. SpringMVC的数据响应-页面跳转-返回ModelAndView形式1(应用)
  5. Spring新注解详解
  6. OpenResty介绍
  7. 角色操作-查询所有角色代码实现
  8. RocketMQ的存储之消息的存储分析
  9. HTTP_请求消息_请求行
  10. php5.6.16,OSX 10.11 中重新编译PHP5.6.16问题