zoukankan      html  css  js  c++  java
  • HRBUST

    https://vjudge.net/problem/HRBUST-1658

    判断一个图是否能够用一笔画下来.规定,所有的边都只能画一次,不能重复画。

    Input

    第一行只有一个正整数N(N<=10)表示测试数据的组数。

    每组测试数据的第一行有两个正整数P,Q(P<=100,Q<=100),分别表示这个画中有多少个顶点和多少条连线。(点的编号从1到P)

    随后的Q行,每行有两个正整数A,B(0<A,B<P),表示编号为A和B的两点之间有连线。

    Output

    如果存在符合条件的连线,则输出"Yes",

    如果不存在符合条件的连线,输出"No"。

    Sample Input

    2

    4 3

    1 2

    1 3

    1 4

    4 5

    1 2

    2 3

    1 3

    1 4

    3 4

    Sample Output

    No

    Yes

    解题思路:

    判断一个图是否是欧拉回路,需要满足两个条件:1.连通图,2.所有点的度都为偶数。

    这道题不用回到起点,所以起点和终点的度可以为1。

    #include <stdio.h>
    #include <string.h>
    #define N 120
    int degree[N], f[N];
    int getf(int v)
    {
    	if(f[v]==v)
    		return v;
    	else{
    		f[v]=getf(f[v]);
    		return f[v];
    	}
    }
    void merge(int u, int v)
    {
    	int t1, t2;
    	t1=getf(v);
    	t2=getf(u);
    	if(t1!=t2)
    		f[t1]=t2;
    }
    int main()
    {
    	int t, p, q, u, v, i, j, sum;
    	scanf("%d", &t);
    	while(t--)
    	{
    		memset(degree, 0, sizeof(degree));
    		scanf("%d%d", &p, &q);
    		for(i=1; i<=p; i++)
    			f[i]=i;
    		while(q--)
    		{
    			scanf("%d%d", &u, &v);
    			degree[u]++;
    			degree[v]++;
    			merge(u, v);
    		}
    		sum=0;
    		for(i=1; i<=p; i++)
    			if(f[i]==i)
    				sum++;
    		if(sum!=1)
    		{
    			printf("No
    ");
    			continue;
    		}
    		sum=0;
    		for(i=1; i<=p; i++)
    			if(degree[i]%2==1)
    				sum+=1;
    		if(sum>2)
    			printf("No
    ");
    		else
    			printf("Yes
    ");
    	}
    	return 0;
    }
  • 相关阅读:
    block 专题--基础
    iOS开发之沙盒机制
    App上架流程(2016最新)
    团队项目个人总结
    结对开发训练(续)(郭林林&胡潇丹)
    结对开发训练(郭林林&胡潇丹)
    计算一篇英语文章出现频率最高的十个单词
    TLB和大叶
    韩顺平的java入门到精通中serversql笔记(包括emp表和dept表,linux的mysql版)
    IPv6
  • 原文地址:https://www.cnblogs.com/zyq1758043090/p/11852606.html
Copyright © 2011-2022 走看看