小丁最近迷恋上一个游戏,传说中的“一笔画”游戏。
那么什么是一笔画?如下图,顾名思义就是一笔可以完成的图。一笔画最基本的要求是在画图的过程中,笔不能离开纸,且笔所画过的线不能重复,最后画完所有的线便算完成。
虽然小丁喜欢玩这个游戏,但有时候花费半天也找不到答案。小丁听说写一个计算机程序便能判断是否可以一笔画图,所以他希望善良可爱的你来帮帮他的忙。
快来帮帮弱小,可怜,又无助的小丁。
输入格式:
给出图中的节点数N(1<=N<=1000,编号1-N)和边数M;随后M行给出存在边的两个节点的编号。
输出格式:
能够一笔画的图输出Y,否则输出N。
输入样例1:
3 2
1 2
2 3
输出样例1:
Y
输入样例2:
4 3
1 2
1 3
1 4
输出样例2:
N
思路:①一笔画只能有一个连通分量 ②奇数只有0个或2个 同时满足这俩个条件即为一笔画
注:奇数为含有奇数边的顶点
代码如下:
#include<bits/stdc++.h> using namespace std; int p[10000]; int find(int x)//并查集 不会百度或者下方评论我 我会详解 { if(p[x]!=x) p[x]=find(p[x]); return p[x]; } int main() { int n,m,x,y,sum=0,cnt=0; cin>>n>>m; int a[1000]={0}; for(int i=1;i<=n;i++) p[i]=i; while(m--) { cin>>x>>y; p[find(y)]=find(x);//并查集判断连通分量是不是只有一个 a[x]++;a[y]++; //判断奇数(边数为奇数)有几个,因为是无向图 } for(int i=1;i<=n;i++) { if(p[i]==i) sum++; if(a[i]%2!=0) cnt++; } if(sum==1) if(cnt==0||cnt==2) cout<<"Y"; else cout<<"N"; else cout<<"N";//如有不理解下方评论 return 0; }