题目大意:问由几条道路组成的图需要几笔画完成;
解题思路:如果图是一条链或欧拉回路只需一笔画,但如果不连通,分为几个小子图,怎么解决??每个子图中的嫉妒点数除以2,然后把所有子图的奇度点数除以2,加起来就是总共需要几笔画;
#include<iostream>
#include<cstring>
using namespace std;
#define MAX 100001
int father[MAX],node[MAX],flag[MAX];
int n;
int find(int t)//并查集
{
if(father[t]!=t)
father[t]=find(father[t]);
return father[t];
}
void work()
{
int x;
for(int i=1;i<=n;i++)
{
x=find(i);//记录父节点,一个父节点大祖先就是一个子图,如果只有一个,即为连通图
if(flag[x]==-1&&node[i])//如果父节点没有调用过并且有入度点,初始化为0
flag[x]=0;
if(node[i]%2==1)//记录奇度点数
flag[x]++;
}
}
int main()
{
int m,i,sum,a,b;
while(cin>>n>>m)
{
memset(node,0,sizeof(node));
memset(flag,-1,sizeof(flag));
sum=0;
for( i=1;i<=n;i++)
father[i]=i;
while(m--)
{
cin>>a>>b;
node[a]++;node[b]++;//路是双向的
father[find(a)]=find(b);
}
work();
for(i=1;i<=n;i++)
{
if(flag[i]!=-1)
{
if(flag[i]==0)//为0则表示没有奇度点,一笔画就能完成
sum++;
else
sum+=flag[i]/2;//奇度点除以2即为需要几笔画完成
}
}
cout<<sum<<endl;
}
return 0;
}