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;
    }
  • 相关阅读:
    Building Java Projects with Gradle
    Vert.x简介
    Spring及Spring Boot 国内快速开发框架
    dip vs di vs ioc
    Tools (StExBar vs Cmder)which can switch to command line window on context menu in windows OS
    SSO的定义、原理、组件及应用
    ModSecurity is an open source, cross-platform web application firewall (WAF) module.
    TDD中测试替身学习总结
    Spring事务银行转账示例
    台式机(华硕主板)前面板音频接口(耳机和麦克风)均无声的解决办法
  • 原文地址:https://www.cnblogs.com/YSFAC/p/9919844.html
Copyright © 2011-2022 走看看