一笔画问题
时间限制:
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
欧拉回路
01.
#include<iostream>
02.
#include<cstring>
03.
#include<vector>
04.
using
namespace
std;
05.
int
p,q,x,y,sum=0,k[1010];
06.
vector<
int
> v[1010];
07.
08.
void
dfs(
int
a)
09.
{
10.
k[a]=1;
11.
vector<
int
>::iterator it;
12.
for
(it=v[a].begin();it!=v[a].end();it++)
13.
if
(k[*it]==0)
14.
dfs(*it);
15.
}
16.
17.
int
main()
18.
{
19.
int
N;
20.
cin>>N;
21.
while
(N--)
22.
{
23.
cin>>p>>q;
24.
memset
(k,0,
sizeof
(k));
25.
for
(
int
i=1;i<=p;i++)
26.
v[i].clear();
27.
for
(
int
i=0;i<q;i++)
28.
{
29.
cin>>x>>y;
30.
v[x].push_back(y);
31.
v[y].push_back(x);
32.
}
33.
dfs(1);
34.
int
m=0;
35.
for
(
int
i=1;i<=p;i++)
36.
if
(!k[i])
37.
m++;
38.
if
(m)
39.
cout<<
"No"
<<endl;
40.
else
41.
{
42.
int
z=0;
43.
for
(
int
i=1;i<=p;i++)
44.
if
(v[i].size()%2!=0)
45.
z++;
46.
if
(z==2||z==0)
47.
cout<<
"Yes"
<<endl;
48.
else
49.
cout<<
"No"
<<endl;
50.
}
51.
}
52.
return
0;
53.
}
-
第一行只有一个正整数N(N<=10)表示测试数据的组数。