简单题

【问题描述】

dzy 手上有一张 n 个点 m 条边的联通无向图。仙人掌是一张每条边最多在一个简单环内的联通无向图。他想求这个无向图的生成仙人掌中最多有多少条边。生成仙人掌是原图的生成子图,生成子图包括原图的全部点与部分边。但是 dzy 觉得这个问题太简单了,于是他定义了“美丽的生成仙人掌”,即在一个生成仙人掌中如果满足对于任意编号为 i,j(i < j) 的两点,存在一条它们之间的简单路径上面有 j-i+1 个点,则这个仙人掌是美丽的。他现在想要知道这张图的美丽的生成仙人掌中最多有多少条边,你能帮帮他
吗?

【输入】

第一行两个整数 n,m。接下来 m 行每行两个整数 ui,vi,表示这两个点之
间有一条无向边。保证图中没有自环。

【输出】

仅一行一个整数表示答案。

【输入输出样例 】

simple.in
2 1
1 2

simple.out
1

【数据规模和约定】

对于 10% 的数据,n <=10。
对于 30% 的数据,n <=10^3。
对于 100% 的数据,n <=10^5 ;m <= 2n。

【题解】

这里写图片描述

考试时我没看懂题目,一眼以为是图论题,却又无从下手。(听说有的命题人喜欢把难题命名为“大水题”?)

结果还真是道贪心大水题!!!

根据题意,因为数据保证有解,所以在图中必定存在一条从1 -> 2 -> … -> n的链,最后的答案呢肯定是以此为基础的。

我们把 1 到 n 的这条链看作是一条线段。再加边看作是用一条新的线段来覆盖。根据仙人掌图的定义,任何一条边不能同时存在于两个不同的环中。意思就是在新加的这些线段中不能有任何两条线段覆盖同一个区域。求最多的边就是求最多的线段。这不就是一个简单的线段覆盖问题么? 把所有边按右端点排序,一个贪心就好了。

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#define fp(i,a,b) for(int i=a;i<=b;i++)
#define fq(i,a,b) for(int i=a;i>=b;i--)
#define il inline
#define ll long long 
using namespace std;
const int maxn=1e5+5;
struct Edge
{
    int l,r;
}a[maxn<<1];
int n,m,vis[maxn]={};
il bool cmp(Edge x,Edge y)
{
    return x.r<y.r;
}
il int gi()
{
   int x=0;
   short int t=1;
   char ch=getchar();
  while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
  if(ch=='-') t=-1,ch=getchar();
  while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
  return x*t;
}
int main()
{
    freopen("simple.in","r",stdin);
    freopen("simple.out","w",stdout);
    n=gi();m=gi();
    fp(i,1,m)
    {
        int x=gi(),y=gi();
        if(x>y) swap(x,y);
        a[i]=(Edge){x,y};
    }
    sort(a+1,a+1+m,cmp);
    int x=1,ans=n-1;
    fp(i,1,m)
    {
        if(a[i].r==a[i].l+1&&!vis[a[i].l]) {vis[a[i].l]=1;continue;}
        if(a[i].l<x) continue;
        x=a[i].r;
        ans++;
    }
    printf("%d\n",ans);
    fclose(stdin);
    fclose(stdout);
    return 0;
}
好的,我很乐意为您解释"简单管理系统"的业务用例图。 一个简单的试管理系统的业务用例图通常包含以下主要元素: 1. 系统边界: 用一个大矩形表示整个系统。 2. 参与者(Actor): 表示与系统交互的外部实体,通常用人形图标表示。对于试管理系统,主要的参与者可能是: - 教师 - 学生 - 管理员 3. 用例(Use Case): 表示系统提供的功能,用椭圆形表示。可能的用例包括: - 创建试 - 编辑试 - 删除试 - 搜索试 - 查看试 - 导出试 - 导入试 - 生成试卷 - 提交答案 - 评分 4. 关联关系: 用线条连接参与者和用例,表示它们之间的交互。 5. 包含关系: 用带箭头的虚线连接用例,表示用例之间的包含关系。 6. 泛化关系: 用带空心箭头的实线连接用例,表示用例之间的继承关系。 一个简化的示例图可能如下: ``` +---------------------+ | 简单管理系统 | +---------------------+ | | | / \ \ / \ \ +------+ +-------+ +------+ | 教师 | | 学生 | | 管理员| +------+ +-------+ +------+ | | | | | | +------+-----+ +---+---+ +---+---+ | | | | | | v v v v v v [创建试] [编辑试] [搜索试] [查看试] [生成试卷] | | | | | | +-----+--+---------+ | v [导出试] [导入试] [提交答案] [评分] ``` 这个用例图展示了试管理系统的主要功能和参与者。教师可以创建、编辑和删除试;学生可以搜索和查看试,并提交答案;管理员可以生成试卷、导出和导入试
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值