博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Ant Trip(画几笔)
阅读量:4664 次
发布时间:2019-06-09

本文共 1246 字,大约阅读时间需要 4 分钟。

给你无向图的 N个点和 M条边,保证这 M条边都不同且不会存在同一点的自环边,现在问你至少要几笔才能所有边都画一遍。(一笔画的时候笔不离开纸)

#include
#define re return#define inc(i,l,r) for(int i=l;i<=r;++i)using namespace std;template
inline void rd(T&x){ char c;bool f=0; while((c=getchar())<'0'||c>'9')if(c=='-')f=1; x=c^48; while((c=getchar())>='0'&&c<='9')x=x*10+(c^48); if(f)x=-x;}const int maxn=100005; int n,m,d[maxn],fa[maxn],cnt[maxn];inline int find(int x){ re x==fa[x]?x:fa[x]=find(fa[x]);}int main(){ int x,y,f1,f2; while(~(scanf("%d%d",&n,&m))) { inc(i,1,n)fa[i]=i,cnt[i]=d[i]=0; if(!m) { printf("0\n"); continue; } inc(i,1,m) { rd(x),rd(y); ++d[x];++d[y]; f1=find(fa[x]);f2=find(fa[y]); if(f1!=f2)fa[f1]=f2; //并查集判连通 } inc(i,1,n) { if(d[i]&1) ++cnt[find(fa[i])];//累加到所属并查集里 } int ans=0; inc(i,1,n) if(fa[i]==i&&d[i]&&!cnt[i])ans+=1; //如果该并查集有边但是欧拉回路 ans+1 else ans+=(cnt[i]>>1); //否则这个并查集以欧拉路径来求笔画数 printf("%d\n",ans); } re 0;}

 

转载于:https://www.cnblogs.com/lsyyy/p/11421825.html

你可能感兴趣的文章
k8s 英文文档翻译
查看>>
Python os模块
查看>>
jQuery中addClass不起作用
查看>>
python--关于函数传递
查看>>
产品经理与项目经理
查看>>
50. 分别使用迭代或递归来实现对数组的二分查找(折半查找)
查看>>
造成 nginx 403 forbidden 的几种原因
查看>>
url-safe base64 && base64
查看>>
KVM虚拟化技术
查看>>
数据库原理--数据库系统基础
查看>>
LETTers比赛第七场 Qin Shi Huang's National Road System
查看>>
C1TrueGrid 添加行索引
查看>>
最大似然估计 (MLE) 最大后验概率(MAP)
查看>>
js函数中的预编译
查看>>
oc学习之路----代理模式
查看>>
WordPress更换域名完美方法
查看>>
RSA加密解密 错误:Base-64 字符数组的无效长度
查看>>
AngularJS路由
查看>>
一个很实用的,跳转填写 , 回来赋值.
查看>>
你觉得剩菜回锅科学吗?
查看>>