题意:
给一个无向图,n个顶点和m条边,问至少需要几笔才能把所有边 画一遍
如果该连通分量是一个孤立的点 不用管.
如果有奇数度的点ji[ ]个 需要ji[]/2
如果只有偶数度的点 只要1笔
#include <iostream>
#include <cstring>
using namespace std;
int pre[100005];
int ji[100005],ou[100005];
int d[100005];
int find(int x)
{
int r=x;
while(r!=pre[r])
r=pre[r];
return r;
}
void join(int x,int y)
{
int xx=find(x),yy=find(y);
if(xx!=yy)
pre[xx]=yy;
}
int main()
{int n,m,a,b;
int sum;
while(cin>>n>>m)
{
sum=0;
memset(d,0,sizeof(d));
memset(ji,0,sizeof(ji));
memset(ou,0,sizeof(ou));
for(int i=1;i<=n;i++)
pre[i]=i;
for(int i=0;i<m;i++)
{
cin>>a>>b;
join(a,b);
d[a]++;
d[b]++;
}
for(int i=1;i<=n;i++)
{
if(d[i]==0)
continue;
if(d[i]%2==1)
ji[find(i)]++;
if(d[i]%2==0)
ou[find(i)]++;
}
for(int i=1;i<=n;i++)
{
if(ou[i]>0&&ji[i]==0)
sum++;
if(ji[i]>0)
sum+=ji[i]/2;
}
cout<<sum<<endl;
}
return 0;
}