BZOJ 2935/ Poi 1999 原始生物

【bzoj2935】【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)
 
 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 __&
",x)
24 #define D_e_Line printf("-----------------
")
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 */
View Code
原文地址:https://www.cnblogs.com/bingoyes/p/10303043.html