对于一笔画问题首先应该想到的就是欧拉回路,在离散数学里面有一个判断无向连通图有欧拉回路的充要条件:奇数度结点的个数为2个或0个。从题目可以看出,测试数据并不能保证图连通,所以先用比较简单的bfs判断连通性,再用充要条件判断图是否连通
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1010;
vector<int> edge[maxn];
int visit[maxn];
int d[maxn];
int dfs(int n)
{
for(int i=0;i<edge[n].size();i++)
{
int pos=edge[n][i];
if(!visit[pos])
{
visit[pos]=1;
dfs(pos);
}
}
}
int main()
{
int loop;
scanf("%d",&loop);
while(loop--)
{
int p,q;
memset(d,0,sizeof(d));
memset(visit,0,sizeof(visit));
scanf("%d%d",&p,&q);
for(int i=1;i<=q;i++)
{
int x,y;
scanf("%d%d",&x,&y);
edge[x].push_back(y);
edge[y].push_back(x);
d[x]++;
d[y]++;
}
dfs(1);
int flag=0;
for(int i=1;i<=p;i++)
if(!visit[i])
flag=1;
if(flag)
printf("No\n");
else
{
int count=0;
for(int i=1;i<=p;i++)
if(d[i]%2)
count++;
if(count==2||count==0)
printf("Yes\n");
else
printf("No\n");
}
for(int i=1;i<=p;i++)
edge[i].clear();
}
}