NYOJ42一笔画问题

简介:

一笔画问题
时间限制:3000 ms    内存限制:65535 KB
难度:4
描述
zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来。

规定,所有的边都只能画一次,不能重复画。

 

输入
第一行只有一个正整数N(N=10)表示测试数据的组数。
每组测试数据的第一行有两个正整数P,Q(P=1000,Q=2000),分别表示这个画中有多少个顶点和多少条连线。(点的编号从1到P)
随后的Q行,每行有两个正整数A,B(0A,BP),表示编号为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

 

思路::要判断两点1.连通性(所有点是否完全联通,有一个独立的点都不满足题意);
2.奇数点的个数要么为2要么为0,这是欧拉路的判断,如果奇数点的个数为2,说明有一个开头节点和一个结尾节点,
如果奇数点的个数为0,那么没有开头和结尾,是一个完全的环,依然符合一笔画,剩下的情况一定不符合题意。

接下来就是用DFS染色法把能通过的所有路径全都染色,剩下的没有被染色的则是独立点,则就不能一笔画。


AC代码:

#include<stdio.h>
#include<string.h>
struct node//创建一个路径计数结构体 
{
    int path[1100];  
    int len;  
}a[1100];
int jar[1100];
void DFS(int n)
{
     int last;
     while(a[n].len!=0)//深入搜索 a[n]每一个能连接的点
     {
        last=a[n].path[a[n].len-1];//传回最后一个数据 
        jar[last]=1;
        a[n].len--;//删除最后一个数据 
        DFS(last);//跳向下一个点进行搜索 
     }
}
int main()
{
    int i,j,T,n,m,x,y,num,size,flag;
    scanf("%d",&T);
    while(T--)
    {
       scanf("%d%d",&n,&m);
       memset(a,0,sizeof(a));
       for(i=0;i<m;i++)
       {
          scanf("%d %d",&x,&y);
          a[x].path[a[x].len++]=y;//a[x]末尾添加y
          a[y].path[a[y].len++]=x;//a[y]末尾添加x
       }
       num=0;
       for(i=1;i<=n;i++)
       {
          size=a[i].len;
          if(size%2!=0)//检查每一个点相对于其它点的连通性 
          num++;
       }
       memset(jar,0,sizeof(jar));
       jar[1]=1;//先标记第一个点直接能通过 
       DFS(1);
       flag=1;
       for(i=1;i<=n;i++)
       if(jar[i]==0)//存在点一个点,其与任意一点都不相连 
       {
          flag=0;
          break;
       }
       if(num>2||num==1)//当odd大于2时,说明有的点断层了,当odd等于1时,说明出现了部分环(等于0时是完全环,符合一笔画) 
       flag=0;
       if (flag==1) 
       printf("Yes\n");
       else 
       printf("No\n");
    }
    return 0;
}
相关文章
1341:【例题】一笔画问题
1341:【例题】一笔画问题
140 0
洛谷P1162 填涂颜色——广搜
洛谷P1162 填涂颜色——广搜
72 0
洛谷P3194 [HNOI2008]水平可见直线(计算几何+单调栈)
洛谷P3194 [HNOI2008]水平可见直线(计算几何+单调栈)
99 0
洛谷P3194 [HNOI2008]水平可见直线(计算几何+单调栈)
33.矩形覆盖
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
58 0
洛谷P3829 [SHOI2012]信用卡凸包(点的旋转+凸包)
洛谷P3829 [SHOI2012]信用卡凸包(点的旋转+凸包)
95 0
P4170 [CQOI2007]涂色
P4170 [CQOI2007]涂色
66 0
P4170 [CQOI2007]涂色
杭电OJ 2501 骨牌铺满方格 递推
杭电OJ 2501 骨牌铺满方格 递推
79 0
杭电OJ变形 骨牌铺满方格 2501
杭电OJ变形 骨牌铺满方格 2501
89 0
|
人工智能 算法
洛谷P1387 最大正方形
题目描述 题目链接:https://www.luogu.org/problemnew/show/P1387 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长。 输入输出格式 输入格式:  输入文件第一行为两个整数n,m(1
1306 0