zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    mysql BETWEEN操作符 语法
    mysql IN操作符 语法
    mysql LIKE通配符 语法
    mysql TOP语句 语法
    mysql DELETE语句 语法
    mysql Update语句 语法
    mysql INSERT语句 语法
    mysql ORDER BY语句 语法
    mysql OR运算符 语法
    mysql AND运算符 语法
  • 原文地址:https://www.cnblogs.com/Dreamcaihao/p/3108876.html
Copyright © 2011-2022 走看看