• 仙人掌


    仙人掌

    题目描述:
    LYK 在冲刺清华集训( THUSC)!于是它开始研究仙人掌,它想来和你一起分享它最近研究的结果。
    如果在一个无向连通图中任意一条边至多属于一个简单环(简单环的定义为每个点至多经过一次),且不存在自环,我们称这个图为仙人掌。
    LYK 觉得仙人掌还是太简单了,于是它定义了属于自己的仙人掌。
    定义一张图为美妙的仙人掌,当且仅当这张图是一个仙人掌且对于任意两个不同的点 i,j,存在一条从 i 出发到 j 的路径,且经过的点的个数为|j-i|+1 个。
    给定一张 n 个点 m 条边且没有自环的图, LYK 想知道美妙的仙人掌最多有多少条边。
    数据保证整张图至少存在一个美妙的仙人掌。
    输入格式:
    第一行两个数 n,m 表示这张图的点数和边数。
    接下来 m 行,每行两个数 u,v 表示存在一条连接 u,v 的无向边。
    输出格式:
    一个数表示答案
    输入样例:
    4 6
    1 2
    1 3
    1 4
    2 3
    2 4
    3 4
    输出样例:
    4
    样例解释:
    选择边 1-2,1-3,2-3,3-4,能组成美妙的仙人掌,且不存在其它美妙仙人掌有超过 4 条边。
    数据范围:
    对于 20%的数据 n<=3。
    对于 40%的数据 n<=5。
    对于 60%的数据 n<=8。
    对于 80%的数据 n<=1000。
    对于 100%的数据 n<=100000 且 m<=min(200000,n*(n-1)/2)。
    思路:
    定义一张图为美妙的仙人掌,当且仅当这张图是一个仙人掌
    且对于任意两个不同的点 i,j,存在一条从 i 出发到 j 的
    路径,且经过的点的个数为|j-i|+1 个。
    对于i和i+1要经过2个点即只能是这两个点之间直接有一条边
    这n-1条连接i和i+1的边一定选 选完这些边之后正好满足了
    任意两点之间的要求
    现在即在保证是仙人掌的前提下多选边
    接下来选的边要保证没有交集 因为现在已经选了i到i+1的边
    其他的边会和现在已经选的边形成环 若选两个有交集的边
    则不满足仙人掌的性质
    所以问题就转化成了线段覆盖……

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int maxn=200010;
    int n,m,tot,ans;
    struct node
    {
        int x;
        int y;
        bool operator < (node tmp)const
        {
            return y<tmp.y;
        }
    }a[maxn*2];
    int main()
    {
        freopen("cactus.in","r",stdin);
        freopen("cactus.out","w",stdout);
        int x,y;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d",&x,&y);
            if(x>=y) swap(x,y);
            if(x+1==y) continue;
            a[++tot].x=x;a[tot].y=y;
        }
        sort(a+1,a+tot+1);
        int end=-1;
        for(int i=1;i<=tot;i++)
        if(a[i].x>=end)
        {
            end=a[i].y;
            ans++;
        }
        cout<<ans+n-1;
        fclose(stdin);fclose(stdin);
        return 0;
    }
  • 相关阅读:
    tcp/ip 卷一 读书笔记(1)tcp/ip 概述
    python项目使用jsonschema进行参数校验
    设置TCP_USER_TIMEOUT参数来判断tcp连接是否断开
    OpenStack中memcached的使用和实现
    Ironic中pxe driver和agent driver的区别
    tcp/ip 卷一 读书笔记(2)物理层和链路层网络
    C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区
    软件测试Ron Patton
    实例: 创建一个欢迎cookie
    C/C++中Static的作用详述
  • 原文地址:https://www.cnblogs.com/cax1165/p/6070897.html
Copyright © 2020-2023  润新知