dfs+欧拉回路

在这里插入图片描述
对于一笔画问题首先应该想到的就是欧拉回路,在离散数学里面有一个判断无向连通图有欧拉回路的充要条件:奇数度结点的个数为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();
	}
}

猜你喜欢

转载自blog.csdn.net/qq_40634175/article/details/83834286