zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来。 规定,所有的边都只能画一次,不能重复画。 输入 第一行只有一个正整数N(N<=

欧拉定理 如果一个网络是连通的并且奇顶点的个数等于0或2,那么它可以一笔画出;否则它不可以一笔画出。
判断一笔画的方法:
  ①是连通的。一个图,如果图上任意二点总有线段连接着,就称为连通的。不是连通的就不能一笔画出。
  ②奇点个数是0或者是2。图上线段的端点可以分成二类,奇点和偶数。一个点,以它为端点的线段数是奇数就称为奇点,线段数是偶数就称为偶点。
  一个图是否是一笔画就看奇点的个数,奇点个数是 0 或者 2,就是一笔画,否则就不是一笔画。
所以这个问题完全可以转化策略为:
第一步: 首先我们不管它三七二十几,先进行连通性的判断。
第二步:
(1)如果是连通的,我们来判断此图的度的奇点的个数是0或者是2 ,如果是,则说明这个是欧拉图,即可以一笔画出,反之则不能一笔画出

(2)如果是非连通的,这说明这个图很定不能一笔画出。

#include<iostream>
#include<cstring>
using namespace std;
int edge[2000][2000];
int degree[2000];
int vis[2000];
int e;
void dfs(int cur)
{
for(int i=1;i<=e;i++)
{
if(!vis[i]&&edge[cur][i])
{
vis[i]=1;
dfs(i);
}
}
}
bool judge()
{
dfs(1);
for(int i=1;i<=e;i++)
{if(!vis[i])
return false;
}
int count=0;
for(int i=1;i<=e;i++)
{if(degree[i]%2)
count++;
}
if(count==2||count==0)
return true;
else
return false;
}
int main()
{
int n;
cin>>n;
while(n--)
{memset(vis,0,sizeof(vis));
memset(degree,0,sizeof(degree));
memset(edge,0,sizeof(edge));
int m;
cin>>e>>m;
while(m--)
{
int a,b;
cin>>a>>b;
edge[a][b]=edge[b][a]=1;
degree[a]++;
degree[b]++;
}
if(judge())
cout<<"Yes\n"<<endl;
else
cout<<"No\n"<<endl;
}
return 0;
}


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值