美妙仙人掌 cactus

100 篇文章 0 订阅
29 篇文章 0 订阅

Time Limit:1000ms Memory Limit:64MB

题目描述
LYK在冲刺清华集训(THUSC)!于是它开始研究仙人掌,它想来和你一起分享它最近研究的结果。
这里写图片描述
如果在一个无向连通图中任意一条边至多属于一个简单环(简单环的定义为每个点至多经过一次),且不存在自环,我们称这个图为仙人掌。
LYK觉得仙人掌还是太简单了,于是它定义了属于自己的仙人掌。
定义一张图为美妙的仙人掌,当且仅当这张图是一个仙人掌且对于任意两个不同的点i,j,存在一条从i出发到j的路径,且经过的点的个数为|j-i|+1个。
给定一张n个点m条边且没有自环的图,LYK想知道美妙的仙人掌最多有多少条边。
数据保证整张图至少存在一个美妙的仙人掌。

输入格式(cactus.in)
第一行两个数n,m表示这张图的点数和边数。
接下来m行,每行两个数u,v表示存在一条连接u,v的无向边。

输出格式(cactus.out)
一个数表示答案

输入样例
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)。

首先这n个点应该全选(确实不知道为什么)
由题意可知,一定存在一条连接i与i+1的边,因为只存在一个简单环,所以除了i到i+1的边之外,只能有一条边覆盖i到i+1这个位置,这样就转成了线段覆盖问题。

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#define LL long long
using namespace std;
struct H{
    int l,r;
}a[200009];
int n,m,ans,cnt;
bool cmp(H x,H y)
{
    return x.r<y.r;
}
int main()
{
    freopen("cactus.in","r",stdin);
    freopen("cactus.out","w",stdout);

    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        if(x>y) swap(x,y);
        if(x+1!=y) a[++cnt]=(H){x,y}; 
    }
    sort(a+1,a+cnt+1,cmp);

    ans=n-1;
    int L=0;
    for(int i=1;i<=cnt;i++)
    {
        if(a[i].l>=L) ans++,L=a[i].r;
    }
    printf("%d",ans);
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值