Nyoj 一笔画问题(图论)

时间:2023-12-12 22:32:02

描述

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 <vector>
#include <map>
#include <set>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <string>
#include <cstring>
#include <queue>
using namespace std; #define N 1010
int g[N][N];
bool vis[N]; int bfs(int n)
{
queue<int> q;
int que,du,odd,i;
memset(vis,,sizeof(vis));
q.push();
vis[] = ;
que = ; //队列中点的个数
odd = ; //度为奇数的点的个数
while(!q.empty()){
int top=q.front();
q.pop(); que++;
du=;
for(int i=; i<=n; i++){
if(g[top][i]){
if(!vis[i]){
q.push(i);
vis[i]=;
}
du++;
}
}
if(du&) odd++;
}
if((odd== || odd==)&& que==n) printf("Yes\n");
else printf("No\n");
} int main()
{
int n;
int P,Q,p,q;
scanf("%d",&n);
while(n--){
memset(g,,sizeof(g));
scanf("%d %d",&P,&Q);
while(Q--){
scanf("%d %d",&p,&q);
g[p][q]=g[q][p]=;
}
bfs(P);
}
}