2935: [Poi1999]原始生物
Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 150 Solved: 71
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
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
注:
PIE.IN中的所有特征都包含在以下遗传密码中:
(8, 5, 1, 4, 2, 3, 9, 6, 4, 5, 7, 6, 2, 8, 6)
HINT
思路:如果是个欧拉回路,一笔画的最少用边数就是边+0,点就是边+1;否则,最少的边数=边+奇数点/2-1,点就是边+奇数点/2;
所以最后答案=边数+欧拉回路数+度数为奇数/2;
(非欧拉回路的一笔画最小边数=边+奇数点/2-1,是因为我们可以把奇数点两两配对,然后求一个欧拉回路,最后随便删去一条边。
#include<bits/stdc++.h> #define rep(i,a,b) for(int i=a;i<=b;i++) using namespace std; const int maxn=1010; int d[maxn],vis[maxn],fa[maxn],sum[maxn],ans,A,B; int find(int x){ if(fa[x]==x) return x; return fa[x]=find(fa[x]); } int main() { int N,x,y; scanf("%d",&N); rep(i,1,1000) fa[i]=i; rep(i,1,N) { scanf("%d%d",&x,&y); d[x]++; d[y]--; vis[x]=vis[y]=1; fa[find(x)]=find(y); } rep(i,1,1000) { if(vis[i]){ int f=find(i); sum[f]+=d[i]>=0?d[i]:-d[i]; } } rep(i,1,1000){ if(vis[i]&&find(i)==i){ if(sum[i]==0) A++; else B+=sum[i]; } } printf("%d\n",N+A+B/2); return 0; }