zoukankan      html  css  js  c++  java
  • 仙人掌

    源代码:
    
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int n,m,Num(0),Sum(0);
    struct Node
    {
        int X,Y;
    }Edge[200001];
    bool Rule(Node t1,Node t2)
    {
        return t1.Y<t2.Y;
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for (int a=1;a<=m;a++)
        {
            int t1,t2;
            scanf("%d%d",&t1,&t2);
            if (t1>t2)
              swap(t1,t2);
            if (t1+1!=t2) //想一想,重边对答案没有影响。
            {
                Edge[++Num].X=t1; //非相邻点的连接边。
                Edge[Num].Y=t2;
            }
        }
        sort(Edge+1,Edge+Num+1,Rule); //右端点升序排序。
        int T(0);
        for (int a=1;a<=Num;a++)
          if (Edge[a].X>=T)
          {
            Sum++;
            T=Edge[a].Y;
          }
        printf("%d",Sum+n-1);
        return 0;
    }
    
    /*
        神奇的图论与贪心的结合题,还是要多动脑筋。
        可以发现,题中所要求的仙人掌有如下特点:
            (1)编号相邻的节点之间存在连接边;
            (2)编号不相邻的节点之间若存在连接边,必不与其他边相交;
            (3)连接边数最多;
        容易看出,不过就是一条链加上最大数量的不相交跳跃线段。
        于是问题转化为了线段覆盖问题。
    */
  • 相关阅读:
    Array
    StringBuffer
    String
    字节流
    正则表达式
    coursera 机器学习 linear regression 线性回归的小项目
    立个FLAG!
    排序题目练习(Ignatius and the Pincess IV、排序、Clock、排名)
    codeforces 1006
    codeforces
  • 原文地址:https://www.cnblogs.com/Ackermann/p/6041372.html
Copyright © 2011-2022 走看看