P1636 Einstein学画画
一笔画问题
P1636 Einstein学画画
如果一个图存在一笔画,则一笔画的路径叫做欧拉路,如果最后又回到起点,那这个路径叫做欧拉回路。
奇点:跟这个点相邻的边数目有奇数个的点
不存在奇数个奇点的图
PS: 对于有一笔画的图,存在以下两个定理:
定理一:存在欧拉路的条件:图是连通的,有且只有2个奇点
定理二:存在欧拉回路的条件:图是连通的,有0个奇点
so,如果寻找欧拉回路,对任意一个点进行深度优先遍历
如果寻找欧拉路,则对一个奇点进行深度优先遍历
时间复杂度O(m+n),m为边数,n为点数
代码:
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> using namespace std; int n,m,x,y,maq=0,ans=0; int a[100000]; int main() { cin>>n>>m; for(int i=1;i<=m;i++) { cin>>x>>y; a[x]++;a[y]++; if(x>maq) maq=x; if(y>maq) maq=y; } for(int i=1;i<=maq;i++) if(a[i]%2!=0) ans++; //计算有多少个奇点 if(ans==2||ans==0) //符合欧拉路或欧拉回路,一笔画 { cout<<1; return 0; } cout<<ans/2; //两个奇点确定一笔画,多少组奇点确定多少组笔画 return 0; }