7-11并查集 一笔画 数据结构 PTA

小丁最近迷恋上一个游戏,传说中的“一笔画”游戏。

那么什么是一笔画?如下图,顾名思义就是一笔可以完成的图。一笔画最基本的要求是在画图的过程中,笔不能离开纸,且笔所画过的线不能重复,最后画完所有的线便算完成。

虽然小丁喜欢玩这个游戏,但有时候花费半天也找不到答案。小丁听说写一个计算机程序便能判断是否可以一笔画图,所以他希望善良可爱的你来帮帮他的忙。

快来帮帮弱小,可怜,又无助的小丁。

输入格式:

给出图中的节点数N(1<=N<=1000,编号1-N)和边数M;随后M行给出存在边的两个节点的编号。

输出格式:

能够一笔画的图输出Y,否则输出N。

输入样例1:

3 2
1 2
2 3

输出样例1:

Y

输入样例2:

4 3
1 2
1 3
1 4

输出样例2:

N

 

思路:①一笔画只能有一个连通分量 ②奇数只有0个或2个 同时满足这俩个条件即为一笔画

注:奇数为含有奇数边的顶点

代码如下:

#include<bits/stdc++.h>
using namespace std;
int p[10000];
int find(int x)//并查集 不会百度或者下方评论我 我会详解
{
    if(p[x]!=x)
        p[x]=find(p[x]);
    return p[x];
}
int main()
{
    int n,m,x,y,sum=0,cnt=0;
    cin>>n>>m;
    int a[1000]={0};
    for(int i=1;i<=n;i++)
        p[i]=i;
    while(m--)
    {
        cin>>x>>y;
        p[find(y)]=find(x);//并查集判断连通分量是不是只有一个
        a[x]++;a[y]++;       //判断奇数(边数为奇数)有几个,因为是无向图
    }
    for(int i=1;i<=n;i++)
    {
       if(p[i]==i)
          sum++;
       if(a[i]%2!=0)
            cnt++;
    }
    if(sum==1) 
        if(cnt==0||cnt==2)
            cout<<"Y";
        else 
            cout<<"N";
    else
        cout<<"N";//如有不理解下方评论
    return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值