zoukankan      html  css  js  c++  java
  • 欧拉回路

    欧拉回路

    Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
    Total Submission(s) : 3   Accepted Submission(s) : 2

    Font: Times New Roman | Verdana | Georgia

    Font Size:

    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

    思路:先判断所有点是否在同一集合,再判断是否存在某点的度不是偶数

    #include<stdio.h>
    #include<string.h>
    int a[1005],father[1005],depth[1005];
    void init(int n)
    {
        int i;
        for(i = 1;i <= n;i ++)
        {
            father[i] = i;
            depth[i] = 0;
            a[i] = 0;
        }
    }
    
    int find(int x)
    {
        if(x==father[x])
            return x;
        return father[x] = find(father[x]);
    }
    
    void unit(int x,int y)
    {
        x = find(x);
        y = find(y);
        if(x == y)
            return ;
        if(depth[x] < depth[y])
            father[x] = y;
        else
        {
            if(depth[x]>depth[y])
                father[y] = x;
            else
            {
                father[x] = y;
                depth[y]++;
            }
        }
    }
    
    int main()
    {
        int n,m,i,j,flag;
        while(~scanf("%d%d",&n,&m)&&n)
        {
            flag = 0;
            init(n);
            while(m--)
            {
                scanf("%d%d",&i,&j);
                a[i]++;
                a[j]++;
                i = find(i);
                j = find(j);
                unit(i,j);
            }
            for(i = 1; i <= n; i ++)
            {
                if(i==find(i))
                    flag++;
                if(flag==2)
                    break ;
            }
            if(flag==2)
            {
                printf("0
    ");
                continue ;
            }
           for(i = 1;i <= n; i ++)
           {
                if(a[i]%2!=0)
                    flag = 0;
           }
           if(flag)
              printf("1
    ");
           else
              printf("0
    ");
        }
        return 0;
    }
    
  • 相关阅读:
    HDFS小文件处理——Mapper处理
    HDFS 小文件处理——应用程序实现
    kafka的环境搭建
    Storm集群的搭建
    Pig简单入门
    HBase学习笔记
    HBase的Shell操作
    面试必备2014
    常用SQL Server分页方式
    C# DES 加密解密
  • 原文地址:https://www.cnblogs.com/anhuizhiye/p/3320661.html
Copyright © 2011-2022 走看看