小丁最近迷恋上一个游戏,传说中的“一笔画”游戏。那么什么是一笔画?如下图,顾名思义就是一笔可以完成的图。一笔画最基本的要求是在画图的过程中,笔不能离开纸,且笔所画过的线不能重复,最后画完所有的线便算完成。
虽然小丁喜欢玩这个游戏,但有时候花费半天也找不到答案。小丁听说写一个计算机程序便能判断是否可以一笔画图,所以他希望善良可爱的你来帮帮他的忙。快来帮帮弱小,可怜,又无助的小丁。
输入格式:
给出图中的节点数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
思路分析:
要判断是否可以一笔画完,我们只需要知道某一个点是否可以访问到其它所有点(通过已有的路径),那么对每个点进行回溯判断,如果该节点访问到了所有节点则直接判断结束。
代码如下:(分析代码中给出)
#include<bits/stdc++.h>
using namespace std;
int xia[1002][1003] = { 0 };
int n, m,con=0;
int* tips;
void dfs(int k, int n)
{
tips[k] = 1;//该点被访问
con++;
for (int i = 1; i <= n; i++) {
if (xia[k][i] != 0 && tips[i] == 0) {//如果还有路径就接着向下走
dfs(i, n);
break;
}
}//走完就判断下是不是全走完了,全走完就直接退出,没有就接着递归
if (con == n) { cout << "Y"; exit(0); }//访问到的点个数等于总共点个数则成功
con--;
tips[k] = 0;
}
int main() {
cin >> n >> m;
tips = new int[n + 2]();
int a1, a2;
for (int i = 0; i < m; i++) {
cin >> a1 >> a2;
xia[a1][a2]++;
xia[a2][a1]++;
}//连接
for (int i = 1; i <= n; i++) {
dfs(i, n);//判断每一个点是否可以成功一笔画完
}
cout << "N";//最后都未能成功则失败
}