• NYOJ 题目42 一笔画问题(欧拉图)


    一笔画问题

    时间限制:3000 ms  |  内存限制:65535 KB
    难度:4
    描写叙述

    zyc从小就比較喜欢玩一些小游戏。当中就包含画一笔画。他想请你帮他写一个程序。推断一个图是否可以用一笔画下来。

    规定,全部的边都仅仅能画一次,不能反复画。

    输入
    第一行仅仅有一个正整数N(N<=10)表示測试数据的组数。


    每组測试数据的第一行有两个正整数P,Q(P<=1000,Q<=2000)。分别表示这个画中有多少个顶点和多少条连线。(点的编号从1到P)
    随后的Q行。每行有两个正整数A,B(0<A,B<P),表示编号为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
    来源
    [张云聪]原创
    上传者
    张云聪


    ac代码

    #include<stdio.h>
    #include<string.h>
    int head[1010];
    struct s
    {
    	int u,v,next;
    }edge[2020*2];
    int n,m,cnt,vis[1010],dig[1010],sum;
    void add(int u,int v)
    {
    	edge[cnt].u=u;
    	edge[cnt].v=v;
    	edge[cnt].next=head[u];
    	head[u]=cnt++;
    }
    void dfs(int u)
    {
    	vis[u]=1;
    	sum++;
    	for(int i=head[u];i!=-1;i=edge[i].next)
    	{
    		int v=edge[i].v;
    		if(!vis[v])
    			dfs(v);
    	}
    }
    int main()
    {
    	int t;
    	scanf("%d",&t);
    	while(t--)
    	{
    		//int n,m;
    		scanf("%d%d",&n,&m);
    		int i,cnt=0;
    		memset(head,-1,sizeof(head));
    		memset(vis,0,sizeof(vis));
    		memset(dig,0,sizeof(dig));
    		for(i=0;i<m;i++)
    		{
    			int u,v;
    			scanf("%d%d",&u,&v);
    			dig[u]++;
    			dig[v]++;
    			add(u,v);
    			add(v,u);
    		}
    		sum=0;
    		dfs(1);
    		if(sum<n)
    		{
    			printf("No
    ");
    			continue;
    		}
    		int ans=0;
    		for(i=1;i<=n;i++)
    		{
    			if(dig[i]&1)
    				ans++;
    		}
    		if(ans==2||ans==0)
    		{
    			printf("Yes
    ");
    		}
    		else
    			printf("No
    ");
    	}
    }


     

  • 相关阅读:
    反转链表
    Kafka设计解析
    kafka丢失和重复消费数据
    阿里巴巴分布式数据库服务DRDS研发历程
    ZooKeeper系列文章
    阿里中间件RocketMQ
    Spring Cloud构建微服务架构
    TDDL调研笔记
    从OutStreamWriter 和Filewriter谈Java编码
    在Service里调用AlertDialog
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/6890368.html
Copyright © 2020-2023  润新知