• 欧拉回路


    Problem Description
    欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
     

    Input
    测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结
    束。
     

    Output
    每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。
     

    Sample Input
    3 3 1 2 1 3 2 3 3 2 1 2 2 3 0
     

    Sample Output
    1 0
    构成欧拉回路的条件是每个节点的度数都为偶数且不为0
    #include<cstdio>
    #include<cstring>
    int du[10001];
    int pre[1001];
    int find(int p)
    {
    	while(p!=pre[p])
    	{
    		 p=pre[p];
    	}
    	return p;
    }
    void merge(int x,int y)
    {
    	int fx=find(x);
    	int fy=find(y);
    	if(fx!=fy)
    	{
    		pre[fx]=fy;
    	}
    }
    int main()
    {
    	int n,m;
    	while(scanf("%d",&n),n)
    	{
    		memset(du,0,sizeof(du));
    		scanf("%d",&m);
    		if(n==0&&m==0)
    		{
    		break;
    		}
    			for(int i=1;i<=n;i++)
    		{
    			pre[i]=i;
    		}
    		while(m--)
    		{
    			int u,v;
    			scanf("%d%d",&u,&v);
    			du[u]++;
    			du[v]++;
    			merge(u,v);
    		}
    		int cut=0,sum=0;
    		for(int i=1;i<=n;i++)
    		{
    			if(i==pre[i])
    			{
    				sum++;
    			}
    			if(du[i]%2==0&&du[i]!=0)
    			{
    				cut++;
    			}
    		}
    		if(cut==n&&sum==1)
    		printf("1
    ");
    		else
    		printf("0
    ");
    	}
    	return 0;
    }
    


     

    编程五分钟,调试两小时...
  • 相关阅读:
    win10下 Ubuntu 18.04 LTS 的安装及 rlt8821ce网卡驱动的安装
    网络:tcp/ip
    数据结构分类
    面向对象的solid原则
    mysql数据库的操作
    锁机制
    设计模式在项目中的应用
    aop动态代理底层实现模拟
    变量在内存的分配_复习
    java内部类及类加载顺序
  • 原文地址:https://www.cnblogs.com/kingjordan/p/12027102.html
Copyright © 2020-2023  润新知