比赛 20151026 评测结果 WWAWWWWWWW
题目名称 游历校园 最终得分 10
用户昵称 Steve 运行时间 0.904 s
代码语言 C++ 内存使用 11.36 MiB
提交时间 2015-10-26 21:20:55
显示代码纯文本
  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<map>
  4. #include<iostream>
  5. #define maxn 100005
  6. #define maxx 500005
  7. using namespace std;
  8. map<int,int>Q;
  9. bool f[maxn];
  10. int tot=0,n,m,x,y,ans=-1;
  11. int cnt[maxn],fa[maxn];
  12. int next[maxx*2],end[maxx*2],last[maxx*2];
  13. void _add(int x,int y)
  14. {
  15. tot++;
  16. end[tot]=y;
  17. next[tot]=last[x];
  18. last[x]=tot;
  19. }
  20. void _merge(int x)
  21. {
  22. for(int i=last[x];i;i=next[i])
  23. if(f[end[i]]==false)
  24. {
  25. fa[end[i]]=x;
  26. f[end[i]]=true;
  27. _merge(end[i]);
  28. }
  29. }
  30. int _getfa(int x)
  31. {
  32. if(fa[x]==x)return fa[x];
  33. return _getfa(fa[x]);
  34. }
  35. int main()
  36. {
  37. freopen("sent.in","r",stdin);
  38. freopen("sent.out","w",stdout);
  39. int i,j,k;
  40. scanf("%d%d",&n,&m);
  41. for(i=1;i<=m;i++)
  42. {
  43. scanf("%d%d",&x,&y);
  44. cnt[x]++;cnt[y]++;
  45. _add(x,y);
  46. _add(y,x);
  47. }
  48. //for(i=1;i<=n;i++)cout<<cnt[i]<<" ";
  49. for(i=1;i<=n;i++)fa[i]=i;
  50. for(i=1;i<=n;i++)if(fa[i]==i){f[i]=true;_merge(i);ans++;};
  51. //system("pause");
  52. for(i=1;i<=n;i++)
  53. {
  54. fa[i]=_getfa(i);
  55. if(cnt[i]&1)Q[fa[i]]++;
  56. }
  57. map<int,int>::iterator it;
  58. for(it=Q.begin();it!=Q.end();it++)
  59. {
  60. //cout<<it->first<<" "<<it->second<<endl;
  61. if(it->second>2)ans+=(it->second-2)>>1;
  62. }
  63. printf("%d",ans);
  64. //for(i=1;i<=n;i++)printf("%d %d\n",i,fa[i]);*/
  65. return 0;
  66. }