原始生物的遗传密码是一个自然数的序列K=(a1,...,an)。原始生物的特征是指在遗传密码中连续出现的数对(l,r),即存在自然数i使得l=ai且r=ai+1。在原始生物的遗传密码中不存在(p,p)形式的特征。
求解任务:
请设计一个程序:
·读入一系列的特征。
·计算包含这些特征的最短的遗传密码。
·将结果输出
标签:through dig efi git 推广 输出 == namespace 欧拉路径
(话说我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\n",ans); return 0; }
标签:through dig efi git 推广 输出 == namespace 欧拉路径
原文地址:https://www.cnblogs.com/YSFAC/p/9919844.html