zoukankan      html  css  js  c++  java
  • UVA10054The Necklace (打印欧拉路)

    题目链接

    题意:一种由彩色珠子组成的项链。每个珠子的两半由不同的颜色组成。相邻的两个珠子在接触的地方颜色相同。现在有一些零碎的珠子,需要确定他们是否可以复原成完整的项链

    分析:之前也没往欧拉路上面想,看了书上的分析,太对了。把每一个颜色看做一个节点,把每个珠子的两半练成一条边,就转换成了求是否构成欧拉回路的问题了。

    这道题学到的东西就是欧拉回路的打印,要逆序!!!! 这篇是讲逆序的原因

    如果不逆序,

    这组样例 1,2; 2,3 ; 3,2; 2,1;就打印不对,因为它会打印 1,2;2,1;2,3;3,2这样的,所以就要逆序,逆序的的愿意就是防止顺序到达一个死胡同,就像第二步的2,1,就陷入死胡同了,先深搜,判断 1能否还可以进行,如果1不行的话,就输出1,2,继续以2为原点来进行遍历,这题学到了

     1 #include <iostream>
     2 #include <cstring>
     3 #include <cstdio>
     4 #include <algorithm>
     5 using namespace std;
     6 const int Max = 1000 + 10;
     7 int degree[Max];
     8 int g[Max][Max];
     9 void print(int u)
    10 {
    11     for(int i = 1; i <= 50; i++)
    12     {
    13         if(g[u][i] > 0)
    14         {
    15             g[u][i]--;
    16             g[i][u]--;
    17 
    18             print(i); // 先深搜
    19             printf("%d %d
    ", i, u); // 注意 是 i, u,以为i点已经不能作为起点来进行往下搜了,所以 以 i 为起点到 u
    20         }
    21     }
    22 }
    23 int main(int argc, char** argv)
    24 {
    25     int test, n;
    26     scanf("%d", &test);
    27     for(int t = 1; t <= test; t++)
    28     {
    29         scanf("%d", &n);
    30         memset(g, 0, sizeof(g));
    31         memset(degree, 0, sizeof(degree));
    32         for(int i = 1; i <= n; i++)
    33         {
    34             int a,b;
    35             scanf("%d%d", &a, &b);
    36             degree[a]++;
    37             degree[b]++;
    38             g[a][b]++;
    39             g[b][a]++;
    40         }
    41         int flag = false;
    42         for(int i = 1; i <= 50; i++)
    43         {
    44             if(degree[i] % 2)
    45             {
    46                 flag = true;
    47                 break;
    48             }
    49         }
    50         printf("Case #%d
    ", t);
    51         if(flag)
    52         {
    53             printf("some beads may be lost
    ");
    54         }
    55         else
    56         {
    57             for(int i = 1; i <= 50; i++)
    58                 if(degree[i])
    59                 {
    60                     print(i);
    61                     break;
    62                 }
    63         }
    64         printf("
    ");
    65     }
    66     return 0;
    67 }
    View Code
  • 相关阅读:
    SQL SERVER 性能优化四: 创建分区表
    SQL SERVER 性能优化一: 数据库中几百万数据查询优化
    SQL SERVER 性能优化二: 数据库初始值大小及增长方式设置
    C++连接SQL SERVER 数据库方式
    利用作业定时收缩SQL SERVER数据库
    jQuery easyUI datagrid 增加求和统计行
    jquery easyui DataGrid 数据表格 属性
    jQuery easyui中获取datagrid某一列的值之和
    Maven + Springboot + redis 配置
    mac os Catalina beta Jetbrains idea闪退解决方案
  • 原文地址:https://www.cnblogs.com/zhaopAC/p/5265286.html
Copyright © 2011-2022 走看看