比赛 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;
}