• HDU 1878 欧拉回路(DFS)


    欧拉回路

                Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

                       Total Submission(s): 7721    Accepted Submission(s): 2729

    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
     
     
     
    判断欧拉回路是否存在方法
      有向图:图连通,所有顶点出度等于入度。
      无向图:图连通,所有定点都是偶数度。
     
     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 int   N, M, st, et;
     5 const int MAX_NUM = 1005;
     6 int   visit[MAX_NUM];
     7 int   maze[MAX_NUM][MAX_NUM];
     8 int   degree[MAX_NUM];
     9 bool  bResult;
    10 int   startPoint;
    11 
    12 void dfs(int mark, int curNum)          //mark表示到达第几个点,curNum表示当前点
    13 {
    14     if(bResult)return ;
    15     if(mark==N+1 && curNum==startPoint) //遍历所有点且又回到出发点
    16     {
    17         bResult = true;
    18         return ;
    19     }
    20 
    21     for(int k=1; k<=N; k++)
    22     {
    23         if(visit[k]==0 && maze[curNum][k]==1)
    24         {
    25             visit[k] = 1;
    26             dfs(mark+1, k);
    27             visit[k] = 0;
    28         }
    29     }
    30 }
    31 
    32 int main()
    33 {
    34     while(scanf("%d", &N) && N)
    35     {
    36         bResult = false;
    37         memset(maze, 0, sizeof(maze));
    38         memset(visit, 0, sizeof(visit));
    39         memset(degree, 0, sizeof(degree));
    40         scanf("%d", &M);
    41         while(M--)
    42         {
    43             scanf("%d %d", &st, &et);
    44             degree[st]++;                 //记录点的度数
    45             degree[et]++;
    46             maze[st][et] = maze[et][st] = 1;
    47         }
    48         bool bFlag = true;
    49         for(int k = 1; k <= N; k++)
    50         {
    51             if(degree[k] % 2 == 1)        //若存在点的度数不是偶数度,则不存在欧拉回路
    52             {
    53                 bFlag = false;
    54                 break;
    55             }
    56         }
    57         if(!bFlag)
    58         {
    59             printf("0\n");
    60             continue;
    61         }
    62         for(int k = 1; k <= N; k++)
    63         {
    64             if(bResult)break;
    65             startPoint = k;              //记录开始出发点startPoint
    66             dfs(1, k);
    67         }
    68         if(bResult)
    69             printf("1\n");
    70         else
    71             printf("0\n");
    72     }
    73     return 0;
    74 }
  • 相关阅读:
    堆排序,C++模板编程
    洗牌程序的两种实现方法比较
    读取/保存xml文件的类(序列化/反序列化)
    [返回上一页,并且刷新]
    实现等级的存储过程sql
    C#实现WMI读取远程计算机信息【原】
    开源IT资产管理系统>OCS Inventory NG服务端
    xaf实现自定义只读参数
    How to show a Detail View via code
    15个最好的免费开源电子商务平台
  • 原文地址:https://www.cnblogs.com/Dreamcaihao/p/3108876.html
Copyright © 2020-2023  润新知