题意:

给你一幅图,你要用这些边构造一个树,

s和t两个节点的度数不能超过ds dt
而且图是保证没有环

思路:

树的性质是:无环(已经保证),无向(保证),连通(还要判断)

首先把S,T点从图里剥离出来,就是把S和T点搞成几个连通块

对于这些连通块有三种:只与S连的,只与T连的,还有一种是两个都连的,

然后就是要把S和T与那些连通块相连,保证连通。

由于对于S和T相连的点并不是连通块的老大,而且S和T连出去的点还可能同时在一个连通块里;

所以预处理一下S和T连接点的老大,塞到set里去去个重,连一个子节点或者就是他本身就好了;

中间还要判断S和T的连通性,最后再判断一下度数就好啦

PS:主要是要知道树的性质,还有就是要知道树的哪些边是一定要连的;

好菜啊!!!

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int N=2e5+10;
  5.  
  6. vector<int>ma[N];
  7. vector<int>ans[N],tt[N],ss[N];
  8. set<int>s;
  9. set<int>t;
  10. int num[N];
  11. int S,T;
  12. int pre[N];
  13.  
  14. void dfs(int x,int k)
  15. {
  16. pre[x]=k;
  17. for(int i=0;i<ma[x].size();i++)
  18. {
  19. //printf("%d\n",ma[x][i]);
  20. if(ma[x][i]==S||ma[x][i]==T||pre[ma[x][i]])
  21. continue;
  22. ans[x].push_back(ma[x][i]);
  23. dfs(ma[x][i],k);
  24. }
  25. }
  26.  
  27. int main()
  28. {
  29. int n,m;
  30. int x,y;
  31. int ds,dt;
  32. int ps,pt;
  33. scanf("%d%d",&n,&m);
  34. while(m--)
  35. {
  36. scanf("%d%d",&x,&y);
  37. ma[x].push_back(y);
  38. ma[y].push_back(x);
  39. }
  40. scanf("%d%d%d%d",&S,&T,&ds,&dt);
  41. //首先剥离与s和t连通的东东;
  42. memset(pre,0,sizeof(pre));
  43. for(int i=1;i<=n;i++)
  44. {
  45. if(i==S||i==T||pre[i])
  46. continue;
  47. dfs(i,i);
  48. }
  49. //然后就是从s的一些连通块,或者从t出发的一些连通块
  50. int flag=0;
  51. ps=pt=0;
  52. memset(num,0,sizeof(num));
  53. //建下边,去个重;
  54. for(int i=0;i<ma[S].size();i++)
  55. {
  56. if(ma[S][i]==T)
  57. {
  58. flag++;
  59. continue;
  60. }
  61. s.insert(pre[ma[S][i]]);
  62. ss[pre[ma[S][i]]].push_back(ma[S][i]);
  63. }
  64. for(int i=0;i<ma[T].size();i++)
  65. {
  66. if(ma[T][i]==S)
  67. continue;
  68. t.insert(pre[ma[T][i]]);
  69. tt[pre[ma[T][i]]].push_back(ma[T][i]);
  70. }
  71.  
  72. set<int>::iterator it;
  73. for(it=s.begin();it!=s.end();it++)
  74. num[*it]++;
  75. for(it=t.begin();it!=t.end();it++)
  76. {
  77. num[*it]++;
  78. if(num[*it]==1)
  79. {
  80. ans[T].push_back(tt[*it][0]);
  81. num[*it]=0;
  82. pt++;
  83. }
  84. }
  85. for(it=s.begin();it!=s.end();it++)
  86. {
  87. if(num[*it]==1)
  88. {
  89. ans[S].push_back(ss[*it][0]);
  90. num[*it]=0;
  91. ps++;
  92. }
  93. }
  94. int ff=0;
  95. for(it=s.begin();it!=s.end();it++)
  96. {
  97. if(num[*it]>1)
  98. {
  99. if(!ff)
  100. {
  101. ans[S].push_back(ss[*it][0]);
  102. ans[T].push_back(tt[*it][0]);
  103. ps++;
  104. pt++;
  105. ff=1;
  106. continue;
  107. }
  108. if(ps<ds)
  109. {
  110. ans[S].push_back(ss[*it][0]);
  111. ps++;
  112. }
  113. else//不行的话只能给T啊!!!;
  114. {
  115. ans[T].push_back(tt[*it][0]);
  116. pt++;
  117. }
  118. }
  119. }
  120. if(!ff)//如果不能搞在一起的话
  121. {
  122. if(flag)//判断是否本来就在一起
  123. {
  124. ans[S].push_back(T);
  125. ps++;
  126. pt++;
  127. }
  128. else
  129. {
  130. puts("NO");
  131. return 0;
  132. }
  133. }
  134. if(ps>ds||pt>dt)
  135. puts("No");
  136. else
  137. {
  138. puts("Yes");
  139. for(int i=1;i<=n;i++)
  140. {
  141. for(int j=0;j<ans[i].size();j++)
  142. {
  143. printf("%d %d\n",i,ans[i][j]);
  144. }
  145. }
  146. }
  147. return 0;
  148. }

CodeForces 723F【DFS瞎搞】的更多相关文章

  1. Codeforces Gym 100610 Problem H. Horrible Truth 瞎搞

    Problem H. Horrible Truth Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/1006 ...

  2. 8VC Venture Cup 2016 - Elimination Round B. Cards 瞎搞

    B. Cards 题目连接: http://www.codeforces.com/contest/626/problem/B Description Catherine has a deck of n ...

  3. HDU5971【瞎搞】

    题意:略(忙着准备文化课...明天期中考啊.... 思路: 正解就是染色,2-sat搞: AC代码(虽然是错误的...数据水(过踏马的也行啊,起码打脸他啊!) 4 3 1 0 1 2 2 3 3 4 ...

  4. UVA 11853 [dfs乱搞]

    /* 大连热身E题 不要低头,不要放弃,不要气馁,不要慌张 题意: 在1000×1000的格子内有很多个炮弹中心,半径给定. 为某人能否从西部边界出发,从东部边界走出. 不能输出不能,能的话输出最北边 ...

  5. URAL 1203. Scientific Conference(瞎搞)

    题目链接 本来觉得这不是经典的贪心吗..果断水一次,wa了,看了看discuss,发现貌似不好水,土土的DP了一下,复杂度很高了,又T了...然后想想单调队列,二分什么的...不好往上加,直接搞了标记 ...

  6. B. Salty Fish Go! -期望题(瞎搞题)

    链接:https://www.nowcoder.com/acm/contest/104/B来源:牛客网 题意:A few days ago, WRD was playing a small game ...

  7. HDU5532 Almost Sorted Array(最长上升子序列 or 瞎搞个做差的数组)

    题目链接:点我 题意:给定一个序列,询问是否能删除一个数让它成为非递减或者非递增的序列. 比如说 删除后的序列是1 3 3 5 或者5 3 3 1 或者1 3 5 或者5 3 1 都可以.只要满足删掉 ...

  8. TOJ3097: 单词后缀 (字典树 or map瞎搞)

    传送门 (<---可以点击的~) 时间限制(普通/Java):1000MS/3000MS     内存限制:65536KByte 描述 有些英语单词后缀都是一样的,现在我们需要从给定的一堆单词里 ...

  9. ubuntu--基础环境瞎搞集合

    安装ubuntu系统后有很多东西需要自己瞎搞一下,这里把一些瞎搞的过程记录在这里,方便以后重新装系统后重新配置. 一.安装. 可以在windows下制作启动盘(软碟通),然后开机u盘启动即可安装,预留 ...

随机推荐

  1. Redis 过期键的设置、获取和删除过期时间

    Redis 过期键的设置.获取和删除过期时间 转自http://blog.51cto.com/littledevil/1813956 设置过期 默认情况下键是没有生存时间的,也就是永不过期,除非清空内 ...

  2. linux关机命令详解(转载)

    在linux下一些常用的关机/重启命令有shutdown.halt.reboot.及init,它们都可以达到重启系统的目的,但每个命令的内部工作过程是不同的. Linux centos重启命令: 1. ...

  3. 互联网时代的精准招聘-Uber新手游有感

    找工作难.招人也难.漫天的简历,全是求职者广撒网式的复制粘贴,如何找到合适的人.会认真对待职位的人?或许你须要换换思路,看看Uber新出的手机游戏能够咱啥启发. Uber在过去5年已经蹭蹭成长为估值5 ...

  4. OpenStack部署到Hadoop的四种方案

    随着企业開始同一时候利用云计算和大数据技术.如今应当考虑怎样将这些工具结合使用.在这样的情况下,企业将实现最佳的分析处理能力.同一时候利用私有云的高速弹性 (rapid elasticity) 和单一 ...

  5. oracle 10g 数据库与客户端冲突导致实例创建无监听问题

    同事在oracle 10g上创建一个实例,快结束时弹出一个错误,提示监听失败之类.查看服务,并无生成监听服务.于是删除重来,一连试了好几次,都是如此. 这真是令人心烦意乱.提示里面有说到端口1521, ...

  6. git 的安装

    git在开发中已经成了必备工具了,我们来看看git在各个平台上的安装 1.Linux上安装git $sudo apt-get install git 2.mac上安装 1)homebrew安装git ...

  7. 关于“telnet localhost:8080不能打开到主机的连接, 在端口 23: 连接失败”问题

    你的命令写错了!不是telnet localhost:1433 是 telnet localhost 1433 不要那个:号 http://www.fengfly.com/ 答案补充 :“正在连接到l ...

  8. [HTML & CSS] HTML和CSS基础知识

    最近将博客简单地修饰了下,需要用到HTML和CSS代码,花了一天时间学习了一下这两方面的知识.虽然内容很简单,但是足够用来修改自己的博客了. 1. HTML 1.1. HTML介绍 HTML与CSS的 ...

  9. Codeforces Round #373 (Div. 2) Anatoly and Cockroaches —— 贪心

    题目链接:http://codeforces.com/contest/719/problem/B B. Anatoly and Cockroaches time limit per test 1 se ...

  10. 为 Android 平台开发一个输入法

    学习目标: 实现新的输入法 学习目的: 掌握Android输入法框架 学习收获: Android 1.5 新特色之一就是输入法框架(Input Method Framework,IMF),正是它的出现 ...