zoukankan      html  css  js  c++  java
  • [Poi1999] 原始生物

    2935: [Poi1999]原始生物

    Time Limit: 3 Sec  Memory Limit: 128 MB
    Submit: 145  Solved: 71
    [Submit][Status][Discuss]

    Description

    原始生物的遗传密码是一个自然数的序列K=(a1,...,an)。原始生物的特征是指在遗传密码中连续出现的数对(l,r),即存在自然数i使得l=ai且r=ai+1。在原始生物的遗传密码中不存在(p,p)形式的特征。
    求解任务:
    请设计一个程序:
           ·读入一系列的特征。
           ·计算包含这些特征的最短的遗传密码。
           ·将结果输出

    Input

     第一行是一个整数n ,表示特征的总数。在接下来的n行里,每行都是一对由空格分隔的自然数l 和r ,1 <= l,r <= 1000。数对(l, r)是原始生物的特征之一。输入文件中的特征不会有重复。

    Output

    唯一一行应该包含一个整数,等于包含了PIE.IN中所有特征的遗传密码的最小长度。

    Sample Input

    12
    2 3
    3 9
    9 6
    8 5
    5 7
    7 6
    4 5
    5 1
    1 4
    4 2
    2 8
    8 6

    Sample Output

    15

    注:
    PIE.IN中的所有特征都包含在以下遗传密码中:
    (8, 5, 1, 4, 2, 3, 9, 6, 4, 5, 7, 6, 2, 8, 6)

    HINT

    Source

    (话说我NOIP考前为什么要刷这种毒瘤题啊……)

    题意:

    给定一个有向图,求最少添加多少条边使得该图成为一个欧拉路径。输出欧拉路径上的总点数(具体参考样例)。

    题解:

    首先考虑简单情况,即这个图的基图是联通的情况。(基图:把有向图的边当成无向边重连出来的图)

    若该图是一个欧拉回路,此时总点数等于总边数+1。(从一个点开始绕一圈还要回到该点,起点多遍历一次)

    否则除了起点和终点,所有点的入度都应该等于出度,那么对于一个点$u$,它在欧拉路径上出现的次数就应该等于$max{in(u),out(u)}$。

    推广到该图的基图是若干个联通块的情况,只需要对每个联通块求和即可。(每个联通块内的点数对其他块没有影响)

    代码:

    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    
    using namespace std;
    #define MAXN 1000005
    #define MAXM 5000005
    #define INF 0x7fffffff
    #define ll long long
    
    int hd[MAXN],to[MAXM<<1];
    int nxt[MAXM<<1],cnt,tot;
    int in[MAXN],out[MAXN];
    bool vis[MAXN],has[MAXN];
    bool isr[MAXN];
    
    inline int read(){
        int x=0,f=1;
        char c=getchar();
        for(;!isdigit(c);c=getchar())
            if(c=='-')
                f=-1;
        for(;isdigit(c);c=getchar())
            x=x*10+c-'0';
        return x*f;
    }
    
    inline void addedge(int u,int v){
        to[++cnt]=v,nxt[cnt]=hd[u];
        hd[u]=cnt;return;
    }
    
    inline void dfs(int u){
        vis[u]=1;
        if(in[u]!=out[u]) isr[tot]=0;
        for(int i=hd[u];i;i=nxt[i])
            if(!vis[to[i]])
                dfs(to[i]);
        return;
    }
    
    int main(){
        int N=0,M=read();
        for(int i=1;i<=M;i++){
            int u=read(),v=read();
            addedge(u,v),addedge(v,u);
            has[u]=has[v]=1;
            in[v]++,out[u]++;
            N=max(N,max(u,v));
        }
        for(int i=1;i<=N;i++)
            if(has[i] && !vis[i])
                isr[++tot]=1,dfs(i);
        int ans=0;
        for(int i=1;i<=N;i++)
            if(has[i])
                ans+=max(in[i],out[i]);
        for(int i=1;i<=tot;i++)
            ans+=isr[i];
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    Jsp 4—— 内置对象
    Jsp 3—— 声明语法
    Jsp 2—— 小脚本
    CF1479B1 Painting the Array I
    P5337 [TJOI2019]甲苯先生的字符串
    CF19C Deletion of Repeats
    CF484D Kindergarten
    CF529B Group Photo 2 (online mirror version)
    CF1068B LCM
    CF554A Kyoya and Photobooks
  • 原文地址:https://www.cnblogs.com/YSFAC/p/9919844.html
Copyright © 2011-2022 走看看