一笔画问题,无向图欧拉路或者欧拉回路,注意题目说了,如果是孤立点,则不用考虑。对于每个连通块,如果全都是偶数度(欧拉回路),则需要1笔;如果不是,则需要奇数度顶点个数的1/2笔。
代码:
#include<bits/stdc++.h>
using namespace std;
int par[100005];
struct node
{
int du;
int ji;
}G[100005];
int u[2*100005],v[2*100005];
void init(int n)
{
for(int i=1;i<=n;i++)
par[i]=i;
}
int find(int x)
{
if(x!=par[x])
par[x]=find(par[x]);
return par[x];
}
void union_(int x,int y)
{
x=find(x);
y=find(y);
if(x!=y)
{
par[y]=x;
G[x].ji+=G[y].ji;
}
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)==2)
{
int count=0;
for(int i=1;i<=n;i++)
{
G[i].du=0;
G[i].ji=0;
}
init(n);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&u[i],&v[i]);
G[u[i]].du++;
G[v[i]].du++;
}
for(int i=1;i<=n;i++)
if(G[i].du&1)
G[i].ji=1;
for(int i=1;i<=m;i++)
union_(u[i],v[i]);
for(int i=1;i<=n;i++)
if(par[i]==i&&G[i].du!=0)
{
if(G[i].ji==0)//奇数点个数为 0,欧拉回路(一笔画)
count++;
else
count+=G[i].ji/2;
}
printf("%d\n",count);
}
return 0;
}