BZOJ 2935/ Poi 1999 原始生物
【bzoj2935】【Poi1999】原始生物
2935: [Poi1999]原始生物
Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 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
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)
注:
PIE.IN中的所有特征都包含在以下遗传密码中:
(8, 5, 1, 4, 2, 3, 9, 6, 4, 5, 7, 6, 2, 8, 6)
1 #include<cstdio> 2 //#include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 #include<queue> 7 #define INF 0x3f3f3f3f 8 #define re register 9 #define Ii inline int 10 #define Il inline long long 11 #define Iv inline void 12 #define Ib inline bool 13 #define Id inline double 14 #define ll long long 15 #define Fill(a,b) memset(a,b,sizeof(a)) 16 #define R(a,b,c) for(register int a=b;a<=c;++a) 17 #define nR(a,b,c) for(register int a=b;a>=c;--a) 18 #define Min(a,b) ((a)<(b)?(a):(b)) 19 #define Max(a,b) ((a)>(b)?(a):(b)) 20 #define Cmin(a,b) ((a)=(a)<(b)?(a):(b)) 21 #define Cmax(a,b) ((a)=(a)>(b)?(a):(b)) 22 #define abs(a) ((a)>0?(a):-(a)) 23 #define D_e(x) printf("&__ %d __&\n",x) 24 #define D_e_Line printf("-----------------\n") 25 using namespace std; 26 const int N=1001; 27 Ii read(){ 28 int s=0,f=1;char c; 29 for(c=getchar();c>'9'||c<'0';c=getchar())if(c=='-')f=-1; 30 while(c>='0'&&c<='9')s=s*10+(c^'0'),c=getchar(); 31 return s*f; 32 } 33 Iv print(int x){ 34 if(x<0)putchar('-'),x=-x; 35 if(x>9)print(x/10); 36 putchar(x%10^'0'); 37 } 38 int fa[N],deg[N],vis[N],tag[N]; 39 Ii Find(int x){ 40 return x==fa[x]?x:fa[x]=Find(fa[x]); 41 } 42 int main(){ 43 int m=read(),n=1000; 44 R(i,1,n)fa[i]=i;//Father 45 R(i,1,m){ 46 int u=read(),v=read(); 47 ++deg[u],--deg[v],//Out- In 48 vis[u]=1,vis[v]=1, 49 fa[Find(u)]=Find(v);//Union 50 } 51 int sum=0; 52 R(i,1,n) 53 if(deg[i]) 54 tag[Find(i)]=1,//In the same tag 55 sum+=abs(deg[i]); 56 int k=0; 57 R(i,1,n) 58 if(vis[i]&&Find(i)==i&&!tag[i]) 59 ++k;//Totol tags 60 print(k+(sum>>1)+m); 61 return 0; 62 } 63 /* 64 5 65 1 3 66 3 4 67 2 4 68 4 7 69 4 6 70 71 72 6 73 1 2 74 1 3 75 1 6 76 2 3 77 3 4 78 2 5 79 */