经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
[bzoj1116][POI2008][CLO]
来源:cnblogs  作者:wxyww  时间:2018/12/3 10:13:27  对本文有异议

题目链接

思路

可以先考虑一棵树

如图,如果是一棵树我们肯定会想这样子做,但是现在根没有入度。所以现在需要再加入一条边使他变成基环树。

假如现在加入一条边\(3-2\),那就会出现一个3-1-2-3的环。然后以这个环上的点为根,就可以找到很多棵满足条件的树

可以发现,这样就解决了根没有入度的问题。

结论

每一个与环相连通的点都是合法的,只要判断是否存在不合法的点即可。

代码

  1. /*
  2. * @Author: wxyww
  3. * @Date: 2018-12-02 20:15:02
  4. * @Last Modified time: 2018-12-02 20:21:40
  5. */
  6. #include<cstdio>
  7. #include<iostream>
  8. #include<cstdlib>
  9. #include<cmath>
  10. #include<ctime>
  11. #include<bitset>
  12. using namespace std;
  13. typedef long long ll;
  14. const int N = 100000 + 100,M = 200000 + 100;
  15. ll read() {
  16. ll x=0,f=1;char c=getchar();
  17. while(c<'0'||c>'9') {
  18. if(c=='-') f=-1;
  19. c=getchar();
  20. }
  21. while(c>='0'&&c<='9') {
  22. x=x*10+c-'0';
  23. c=getchar();
  24. }
  25. return x*f;
  26. }
  27. int col[N],fa[N];
  28. int find(int x) {
  29. return x == fa[x] ? x : fa[x] = find(fa[x]);
  30. }
  31. int main() {
  32. int n = read(),m = read();
  33. for(int i = 1;i <= n;++i) fa[i] = i;
  34. for(int i = 1;i <= m;++i) {
  35. int u = find(read()),v = find(read());
  36. if(u == v) {
  37. col[u] = 1;
  38. continue;
  39. }
  40. if(rand() & 1) swap(u,v);
  41. fa[u] = v;
  42. col[v] |= col[u];
  43. }
  44. for(int i = 1;i <= n;++i) {
  45. if(!col[find(i)]) {
  46. puts("NIE");
  47. return 0;
  48. }
  49. }
  50. puts("TAK");
  51. return 0;
  52. }

一言

万丈红尘三杯酒,千秋大业一壶茶。 ——大智慧

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号