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;
    }
  • 相关阅读:
    多线程与MySQL(十)
    多进程与多线程(九)
    异常处理与网络编程(八)
    面向对象,绑定方法与异常处理(七)
    模块与对象(六)
    包与模块(五)
    迭代器与函数Python学习(四)
    函数与装饰器Python学习(三)
    数据库
    并发编程
  • 原文地址:https://www.cnblogs.com/zyq1758043090/p/11852606.html
Copyright © 2011-2022 走看看