zoukankan      html  css  js  c++  java
  • NYOJ 42 一笔画问题

    一笔画问题

    时间限制:3000 ms  |  内存限制:65535 KB
    难度:4
     
    描述

    zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来。

    规定,所有的边都只能画一次,不能重复画。

     
    输入
    第一行只有一个正整数N(N<=10)表示测试数据的组数。
    每组测试数据的第一行有两个正整数P,Q(P<=1000,Q<=2000),分别表示这个画中有多少个顶点和多少条连线。(点的编号从1到P)
    随后的Q行,每行有两个正整数A,B(0<A,B<P),表示编号为A和B的两点之间有连线。
    输出
    如果存在符合条件的连线,则输出"Yes",
    如果不存在符合条件的连线,输出"No"。
    样例输入
    2
    4 3
    1 2
    1 3
    1 4
    4 5
    1 2
    2 3
    1 3
    1 4
    3 4
    样例输出
    No
    Yes

    能一笔画完的图必定满足的条件:1.该图是连通的
                   2.该图的奇度数节点为0或2

    这里用了dfs遍历,由于用二维数组记录图,所以造成很多无谓的访问和判断,效率不是很高,不过还是a了,建议使用邻接表记录图。


     1 #include<stdio.h>
     2 bool visited[1005] = {false};
     3 int  dotin[1005] = {0};
     4 int graph[1005][1005];
     5 void dfs(int k, int n)
     6 {
     7     visited[k] = true;
     8     int i,j;
     9     for (i=k; i <= n; i++)
    10     {
    11         for (j=1; j <= n; j++)
    12             if (graph[k][j] != 0){
    13                 if (!visited[j])
    14                     dfs(j,n);
    15             }
    16     }
    17 }
    18 int main()
    19 {
    20     int n,p,q,a,b,i,j,dotnum = 0;
    21     bool yes = true;
    22     scanf("%d",&n);
    23     for (i=1; i < 1001; i++)
    24         for (j=1; j < 1001; j++)
    25             graph[i][j] = 0;
    26     while (n--)
    27     {
    28         scanf("%d%d",&p,&q);
    29         for (i=0; i < q; i++)
    30         {
    31             scanf("%d%d",&a,&b);
    32             graph[a][b] = 1;
    33             graph[b][a] = 1;
    34             dotin[a]++;
    35             dotin[b]++;
    36         }
    37     dfs(1,p);
    38     for (i=1; i <= p; i++)
    39         if (!visited[i])
    40         {
    41             yes = false;
    42             break;
    43         }
    44     for (i=1; i <= p; i++)
    45         if (dotin[i]%2)
    46             dotnum++;
    47     if ((yes && dotnum == 2) || (yes && dotnum == 0))
    48         printf("Yes
    ");
    49     else
    50         printf("No
    ");
    51     yes = true;
    52     dotnum = 0;
    53     for (i=1; i <= p; i++)
    54         dotin[i] = 0;
    55     for (i=1; i <= p; i++)
    56         visited[i] = false;
    57     for (i=1; i <= p; i++)
    58         for (j=1; j <= p; j++)
    59             graph[i][j] = 0;
    60     }
    61 }

  • 相关阅读:
    75. Sort Colors
    101. Symmetric Tree
    121. Best Time to Buy and Sell Stock
    136. Single Number
    104. Maximum Depth of Binary Tree
    70. Climbing Stairs
    64. Minimum Path Sum
    62. Unique Paths
    css知识点3
    css知识点2
  • 原文地址:https://www.cnblogs.com/george-cw/p/3970732.html
Copyright © 2011-2022 走看看