NYoj-42-一笔画问题-DFS

一笔画问题

时间限制:3000 ms  |  内存限制:65535 KB

难度:4

描述

zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来。

规定,所有的边都只能画一次,不能重复画。

输入
第一行只有一个正整数N(N<=10)表示测试数据的组数。

每组测试数据的第一行有两个正整数P,Q(P<=1000,Q<=2000),分别表示这个画中有多少个顶点和多少条连线。(点的编号从1到P)

随后的Q行,每行有两个正整数A,B(0<A,B<P),表示编号为A和B的两点之间有连线。

输出
如果存在符合条件的连线,则输出"Yes",

如果不存在符合条件的连线,输出"No"。

样例输入
2
4 3
1 2
1 3
1 4
4 5
1 2
2 3
1 3
1 4
3 4
样例输出
No
Yes

#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
using namespace std;
int line[1010];   //统计各个结点的度
int visit[1010];   //记录访问过的点
int G[1010][1010]; //记录i,j是否相连
int vertex,edge;
void DFS(int i)    //判断是否连通
{
	//int v=i;
	visit[i]=1;    //i 已访问
	for(int v=0;v<=vertex;v++)
	{
		if(v!=i && G[i][v] &&!visit[v]) //找一个!=i /与i连通 /没有访问过得点
		    DFS(v);//继续从这个点开始往下访问
	}
}
int main()
{
	int T,x,y,count,flag;
	while(~scanf("%d",&T))
	{
		while(T--)
		{
			count=0;
			flag=1;
			scanf("%d %d",&vertex,&edge); //顶点数和边数
			memset(line,0,sizeof(line));
			memset(visit,0,sizeof(visit));
			memset(G,0,sizeof(G));
			for(int i=1;i<=edge;i++)
			{
				scanf("%d%d",&x,&y);
				G[x][y]=G[y][x]=1;
				line[x]++;    //该点的度
				line[y]++;
			}
			DFS(0);
			for(int i=0;i<=vertex;i++)
			{
				G[i][i]=1;
				if(!visit[i])
				   flag=0;
				if(line[i]%2!=0)
				   count++;
			}
			if(flag)
			{
				if(count==2||count==0)
				{
					printf("Yes\n");
				}
				else
				{
					printf("No\n");
				}
			}
			else
			{
				printf("No\n");
			}
		}
	}
	return 0;
}

时间: 2024-11-12 21:53:14

NYoj-42-一笔画问题-DFS的相关文章

NYOJ 42 一笔画问题

一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来. 规定,所有的边都只能画一次,不能重复画. 输入 第一行只有一个正整数N(N<=10)表示测试数据的组数. 每组测试数据的第一行有两个正整数P,Q(P<=1000,Q<=2000),分别表示这个画中有多少个顶点和多少条连线.(点的编号从1到P) 随后的Q行,每行有两个正整数A,B(0<

NYOJ 42 一笔画

一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来. 规定,所有的边都只能画一次,不能重复画. 输入 第一行只有一个正整数N(N<=10)表示测试数据的组数.每组测试数据的第一行有两个正整数P,Q(P<=1000,Q<=2000),分别表示这个画中有多少个顶点和多少条连线.(点的编号从1到P)随后的Q行,每行有两个正整数A,B(0<A,

nyoj 42一笔画问题

一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来. 规定,所有的边都只能画一次,不能重复画. 输入 第一行只有一个正整数N(N<=10)表示测试数据的组数.每组测试数据的第一行有两个正整数P,Q(P<=1000,Q<=2000),分别表示这个画中有多少个顶点和多少条连线.(点的编号从1到P)随后的Q行,每行有两个正整数A,B(0<A,

NYOJ 1058 部分和问题 【DFS】

部分和问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 给定整数a1.a2........an,判断是否可以从中选出若干数,使它们的和恰好为K. 输入 首先,n和k,n表示数的个数,k表示数的和. 接着一行n个数. (1<=n<=20,保证不超int范围) 输出 如果和恰好可以为k,输出"YES",并按输入顺序依次输出是由哪几个数的和组成,否则"NO" 样例输入 4 13 1 2 4 7 样例输出 YES 2 4 7 简

NYOJ 题目42 一笔画问题

一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来. 规定,所有的边都只能画一次,不能重复画. 输入 第一行只有一个正整数N(N<=10)表示测试数据的组数.每组测试数据的第一行有两个正整数P,Q(P<=1000,Q<=2000),分别表示这个画中有多少个顶点和多少条连线.(点的编号从1到P)随后的Q行,每行有两个正整数A,B(0<A,

NYOJ 题目42 一笔画问题(欧拉图)

一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描写叙述 zyc从小就比較喜欢玩一些小游戏.当中就包含画一笔画.他想请你帮他写一个程序.推断一个图是否可以用一笔画下来. 规定,全部的边都仅仅能画一次,不能反复画. 输入 第一行仅仅有一个正整数N(N<=10)表示測试数据的组数. 每组測试数据的第一行有两个正整数P,Q(P<=1000,Q<=2000).分别表示这个画中有多少个顶点和多少条连线.(点的编号从1到P) 随后的Q行.每行有两个正整数A,B(0

nyoj 1237 最大岛屿(dfs)

描述 神秘的海洋,惊险的探险之路,打捞海底宝藏,激烈的海战,海盗劫富等等.加勒比海盗,你知道吧?杰克船长驾驶着自己的的战船黑珍珠1号要征服各个海岛的海盜,最后成为海盗王. 这是一个由海洋.岛屿和海盗组成的危险世界.面对危险重重的海洋与诡谲的对手,如何凭借智慧与运气,建立起一个强大的海盗帝国. 杰克船长手头有一张整个海域的海图,上面密密麻麻分布着各个海屿的位置及面积.他想尽快知道整个海域共有多少岛屿以及最大岛屿的面积. 输入 第1行:M N T,表示海域的长,宽及一个单位表示的面积大小 接下来有M

NYOJ - 1015 二部图(bfs/dfs)

题目链接:点我点我 题意:二分图判断问题 题解:两种解法,模拟下匹配过程. 1 //二分图匹配dfs 2 #include <cstring> 3 #include <vector> 4 #include <iostream> 5 #include <algorithm> 6 using namespace std; 7 8 const int N=11111; 9 vector <int> E[N]; 10 int col[N]; 11 12

NYOJ(42)欧拉图

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=42 我是参考了红黑联盟的结题报告了的.但是有一个位置,应该是红黑联盟写错了吧,就是那个连通性的定义这里. 欧拉定理: 1.图是连通的,每两个点之间要直接或者间接相连.(这里红黑联盟好像写错了) 2.奇点总和只能是0或2: 这里的dfs写的很巧妙,我就是在这里WA了,dfs(k)时,如果搜到一条边,然而只增加k这个的度,因为之后dfs(i)时,再加上i的度,而且不会访问k这个点. 之后,帆