比赛 |
20151026 |
评测结果 |
WWAWWWWWWW |
题目名称 |
游历校园 |
最终得分 |
10 |
用户昵称 |
Steve |
运行时间 |
0.904 s |
代码语言 |
C++ |
内存使用 |
11.36 MiB |
提交时间 |
2015-10-26 21:20:55 |
显示代码纯文本
- #include<cstdio>
- #include<cstdlib>
- #include<map>
- #include<iostream>
- #define maxn 100005
- #define maxx 500005
- using namespace std;
- map<int,int>Q;
- bool f[maxn];
- int tot=0,n,m,x,y,ans=-1;
- int cnt[maxn],fa[maxn];
- int next[maxx*2],end[maxx*2],last[maxx*2];
- void _add(int x,int y)
- {
- tot++;
- end[tot]=y;
- next[tot]=last[x];
- last[x]=tot;
- }
- void _merge(int x)
- {
- for(int i=last[x];i;i=next[i])
- if(f[end[i]]==false)
- {
- fa[end[i]]=x;
- f[end[i]]=true;
- _merge(end[i]);
- }
- }
- int _getfa(int x)
- {
- if(fa[x]==x)return fa[x];
- return _getfa(fa[x]);
- }
- int main()
- {
- freopen("sent.in","r",stdin);
- freopen("sent.out","w",stdout);
- int i,j,k;
- scanf("%d%d",&n,&m);
- for(i=1;i<=m;i++)
- {
- scanf("%d%d",&x,&y);
- cnt[x]++;cnt[y]++;
- _add(x,y);
- _add(y,x);
- }
- //for(i=1;i<=n;i++)cout<<cnt[i]<<" ";
- for(i=1;i<=n;i++)fa[i]=i;
- for(i=1;i<=n;i++)if(fa[i]==i){f[i]=true;_merge(i);ans++;};
- //system("pause");
- for(i=1;i<=n;i++)
- {
- fa[i]=_getfa(i);
- if(cnt[i]&1)Q[fa[i]]++;
- }
- map<int,int>::iterator it;
- for(it=Q.begin();it!=Q.end();it++)
- {
- //cout<<it->first<<" "<<it->second<<endl;
- if(it->second>2)ans+=(it->second-2)>>1;
- }
- printf("%d",ans);
- //for(i=1;i<=n;i++)printf("%d %d\n",i,fa[i]);*/
- return 0;
- }