zoukankan      html  css  js  c++  java
  • [bzoj1116][POI2008][CLO]

    题目链接

    思路

    可以先考虑一棵树

    如图,如果是一棵树我们肯定会想这样子做,但是现在根没有入度。所以现在需要再加入一条边使他变成基环树。
    假如现在加入一条边(3-2),那就会出现一个3-1-2-3的环。然后以这个环上的点为根,就可以找到很多棵满足条件的树

    可以发现,这样就解决了根没有入度的问题。
    结论
    每一个与环相连通的点都是合法的,只要判断是否存在不合法的点即可。

    代码

    /*
    * @Author: wxyww
    * @Date:   2018-12-02 20:15:02
    * @Last Modified time: 2018-12-02 20:21:40
    */
    #include<cstdio>
    #include<iostream>
    #include<cstdlib>
    #include<cmath>
    #include<ctime>
    #include<bitset>
    using namespace std;
    typedef long long ll;
    const int N = 100000 + 100,M = 200000 + 100;
    ll read() {
       ll x=0,f=1;char c=getchar();
       while(c<'0'||c>'9') {
          if(c=='-') f=-1;
          c=getchar();
       }
       while(c>='0'&&c<='9') {
          x=x*10+c-'0';
          c=getchar();
       }
       return x*f;
    }
    int col[N],fa[N];
    int find(int x) {
       return x == fa[x] ? x : fa[x] = find(fa[x]);
    }
    int main() {
       int n = read(),m = read();
       for(int i = 1;i <= n;++i) fa[i] = i;
       for(int i = 1;i <= m;++i) {
          int u = find(read()),v = find(read());
          if(u == v) {
             col[u] = 1;
             continue;
          }
          if(rand() & 1) swap(u,v);
          fa[u] = v;
          col[v] |= col[u];
       }
       for(int i = 1;i <= n;++i) {
          if(!col[find(i)]) {
             puts("NIE");
             return 0;
          }
       }
       puts("TAK");
       return 0;
    }
    

    一言

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

  • 相关阅读:
    博客园小技巧【转载】
    Windows下的多线程
    【Windows】Windows中的数据类型以及命名
    【文档管理系统】【转】什么是元数据
    CentOS 安装 MariaDB 全部命令
    emacs 入门
    参考路径
    My SQL load data infile 遇到的问题总结
    oracle迁移到mysql(仅使用脚本)
    Eclipse tomcat server 无法添加项目
  • 原文地址:https://www.cnblogs.com/wxyww/p/10055147.html
Copyright © 2011-2022 走看看