UVa 208 - Firetruck

本文介绍了一种改进的回溯算法,通过先筛选出与目标点联通的点,从而避免无效搜索,显著提高了算法效率。适用于解决寻找特定节点间路径的问题。

总体思路很简单,回溯,但直接用矩阵回溯会TLE。因为可能在1与目标点之间不存在通路(即:1 与 目标点分别存在于两个隔绝的联通图中),这样如果直接从1开始往下回溯,会无谓检查到许多无用的点浪费时间,我们可以先将所有与目标点联通的点存于一个数组中,仅在这个数组中查找,就省去很多无谓的查找时间。

代码如下:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
using namespace std;

int cct, fcount, num, _max, save[21], a[21];
bool vis[21][21], v[21], vv[21];
void dfs_1(int cur)//将所有与目标点联通的点存入一个点集合里
{
    vv[cur] = true;
    a[_max++] = cur;
    for (int i = 1; i < 21; i++)
        if (!vv[i] && vis[cur][i])
            dfs_1(i);
}
void dfs_2(int cur, int node)
{
    if(node ==  num)
    {
        ++fcount;
        printf("1");
        for(int i = 0; i < cur; i++)
            printf(" %d", save[i]);
        puts("");
    }
    for(int i = 0; i < _max; i++)
        if(!v[a[i]] && vis[node][a[i]])
        {
            save[cur] = a[i];
            v[a[i]] = true;
            dfs_2(cur + 1, a[i]);
            v[a[i]] = false;
        }
}
int main()
{
#ifdef test
    freopen("sample.txt", "r", stdin);
#endif
    int x, y, fct = 0;
    memset(v, false, sizeof(v));
    while(scanf("%d", &num) != EOF)
    {
        _max = fcount = cct = 0;
        memset(vv, false, sizeof(vv));
        memset(vis, false, sizeof(vis));
        while(1)
        {
            scanf("%d%d", &x, &y);
            if(!x || !y)
                break;
            vis[x][y] = vis[y][x] = true;
        }
        dfs_1(num);
        sort(a, a + _max);
        v[1] = true;
        printf("CASE %d:\n", ++fct);
        dfs_2(0, 1);
        printf("There are %d routes from the firestation to streetcorner %d.\n", fcount, num);
    }
    return 0;
}


<think>我们正在处理关于Mermaid类继承关系图的问题。根据用户提供的引用内容,我们可以总结出以下几个关键点: 1. Mermaid支持类图的绘制,包括类、属性、方法以及类之间的关系(引用[1][3])。 2. 引用[2]展示了一个具体的继承关系Mermaid流程图示例:车辆类作为基类,卡车类继承车辆类,然后怪物卡车类、消防车类和自卸卡车类继承卡车类。 3. 引用[3]详细列出了类图的几种关系:关联、依赖、实现、继承、聚合、组合。 4. 引用[4]提供了一段C++递归代码,用于打印类继承关系(父类到子类的关系),并提到可以用于生成Mermaid图。 用户明确表示:“我想查找mermaid类继承关系图的相关内容”。因此,我们需要重点介绍如何使用Mermaid绘制类继承关系图。 ### 回答结构: 1. **Mermaid类图简介**:简要介绍Mermaid及其在类图绘制中的应用。 2. **类继承关系图的语法**:重点讲解如何用Mermaid表示继承关系(包括示例)。 3. **其他类关系**:由于继承是类关系的一种,我们也可以简要提及其他关系(如组合、聚合等)以便用户全面了解,但重点在继承。 4. **在Typora中使用Mermaid**:因为引用[1]提到Typora,可以简单说明如何在Typora中绘制。 5. **代码生成Mermaid图**:根据引用[4]提到的代码,说明如何从代码中生成类继承关系图(可选,但用户可能感兴趣)。 6. **示例**:给出一个完整的Mermaid类继承关系图示例。 7. **注意事项**:使用Mermaid绘制类图时的一些技巧和常见问题。 ### 注意事项: - 使用中文回答。 - 引用标识放在引用内容的末尾(如[^1])。 - 生成相关问题。 ### 具体回答内容: --- ### Mermaid类继承关系图详解 #### 1. Mermaid类图简介 Mermaid是一种基于文本的图表绘制工具,它使用简单的语法来描述各种图表,包括流程图、时序图、类图等[^1]。在类图中,我们可以定义类、类的成员(属性和方法)以及类之间的关系(如继承、组合等)。通过Mermaid,我们可以轻松地在文档(如Typora)中嵌入类图,方便展示对象的结构和关系。 #### 2. 类继承关系表示法 在Mermaid中,**继承关系**(也称为泛化关系)用带空心三角箭头的实线表示,箭头从子类指向父类。语法为: ``` 子类 --|> 父类 ``` 例如,有一个`Vehicle`(车辆)类,`Car`(小汽车)类继承自`Vehicle`,则可以表示为: ```mermaid classDiagram Vehicle <|-- Car ``` #### 3. 多级继承示例 引用[2]提供了一个车辆类继承关系的例子: ```mermaid classDiagram class Vehicle class Truck class MonsterTruck class FireTruck class DumpTruck Vehicle <|-- Truck Truck <|-- MonsterTruck Truck <|-- FireTruck Truck <|-- DumpTruck ``` #### 4. 类定义语法 在绘制继承关系时,我们也可以定义类的属性和方法。例如: ```mermaid classDiagram class Animal { +String name +int age +void eat() } class Dog { +void bark() } Animal <|-- Dog ``` 这里: - `+`表示`public`(公有)成员 - `-`表示`private`(私有)成员 - `#`表示`protected`(保护)成员 #### 5. 其他类关系(简要) 除了继承,Mermaid还支持以下关系[^3]: - **关联**(Association):`类1 --> 类2`(实线箭头) - **依赖**(Dependency):`类1 ..> 类2`(虚线箭头) - **实现**(Realization):`类1 ..|> 类2`(虚线空心三角箭头) - **聚合**(Aggregation):`类1 --o 类2`(空心菱形箭头) - **组合**(Composition):`类1 --* 类2`(实心菱形箭头) #### 6. 在Typora中使用Mermaid 在Typora中,你可以直接插入代码块并选择语言为`mermaid`,然后编写Mermaid类图语法即可渲染出类图[^1]。例如: ```` ```mermaid classDiagram Animal <|-- Dog Animal <|-- Cat ``` ```` #### 7. 从代码生成Mermaid类图 引用[4]展示了一段递归打印类继承关系的代码,我们可以利用类似思路生成Mermaid图。例如,通过解析代码中的类继承关系,生成对应的Mermaid语法字符串。伪代码思路: ```python # 假设我们有一个类继承关系的列表 relationships = [ {'parent': 'Vehicle', 'child': 'Truck'}, {'parent': 'Truck', 'child': 'MonsterTruck'}, # ... 其他关系 ] # 生成Mermaid字符串 mermaid_code = "classDiagram\n" for rel in relationships: mermaid_code += f" {rel['parent']} <|-- {rel['child']}\n" print(mermaid_code) ``` #### 8. 完整示例 以下是一个包含多个类和继承关系的Mermaid类图示例: ```mermaid classDiagram class Shape { <<interface>> +draw() void } class Circle { -radius: double +getArea() double } class Rectangle { -width: double -height: double } Shape <|.. Circle // Circle实现了Shape接口 Shape <|.. Rectangle // Rectangle实现了Shape接口 class Vehicle { +startEngine() void } class Car { +drive() void } class ElectricCar { +batteryLevel: int } Vehicle <|-- Car Car <|-- ElectricCar ``` #### 9. 注意事项 - 在Mermaid中,类名、属性名和方法名均不支持空格(可用下划线代替或使用双引号包裹,如`"My Class"`)。 - 默认情况下,继承关系箭头是从子类指向父类。 - 可使用`classDef`定义类样式(如引用[2]中的样式定义)。 --- ### 相关问题 §§相关问题§§ 1. Mermaid类图中如何表示接口和实现关系? 2. 除了继承,Mermaid类图还能表示哪些类关系? 3. 如何在Typora中调整Mermaid类图的样式? 4. 如何从C++/Java/Python代码自动生成Mermaid类图? 5. Mermaid类图支持哪些类型的成员修饰符(public、private等)? [^1]: Typora结合Mermaid可以用来绘制类图,这是非常适合在文档中展示对象关系和结构的。 [^2]: 以下是继承关系的 mermaid 流程图。 [^3]: 使用mermaid绘制类图关系。 [^4]: 为代码中的类继承关系生成Mermaid图。 </think>### Mermaid类继承关系图详解 Mermaid是一种轻量级的图表描述语言,特别适合在文档中绘制类继承关系图。以下是核心知识点: #### 1. **基本继承关系语法** 使用空心三角箭头表示继承关系(泛化关系),语法为: ```mermaid classDiagram ParentClass <|-- ChildClass ``` - `ParentClass`:父类名称 - `ChildClass`:子类名称 - `<|--`:继承关系符号(箭头指向父类) > 示例:车辆继承体系[^2] ```mermaid classDiagram Vehicle <|-- Truck Truck <|-- MonsterTruck Truck <|-- FireTruck ``` #### 2. **多级继承表示** 支持任意深度的继承链: ```mermaid classDiagram Animal <|-- Mammal Mammal <|-- Carnivore Carnivore <|-- Lion ``` #### 3. **类成员定义** 可在类中声明属性和方法: ````markdown ```mermaid classDiagram class Shape { <<interface>> +draw() void } class Circle { -radius: double +getArea() double } Shape <|.. Circle // 实现关系 ``` ```` - `+`:public成员 - `-`:private成员 - `<<interface>>`:接口标识 - `<|..`:实现关系符号 #### 4. **样式自定义** 使用`classDef`定义样式: ```mermaid classDiagram classDef base fill:#E5F6FF,stroke:#73A6FF class Vehicle:::base class Truck:::base Vehicle <|-- Truck ``` #### 5. **代码生成类图** 引用[4]展示了从代码自动生成类图的方法: ```cpp // C++示例:递归打印继承关系 void PrintParent(vector<ClassRelationship>& list, string child) { for (auto& rel : list) { if (rel.child == child) { cout << rel.parent << "-->" << rel.child << endl; PrintParent(list, rel.parent); // 递归查找父类 } } } ``` > 此方法可遍历类关系列表生成Mermaid语法[^4] #### 6. **复杂关系综合示例** ```mermaid classDiagram class Engine { +start() void } class Vehicle { +move() void } class Car { -model: string } class ElectricCar { +batteryLevel: int } Engine --* Vehicle // 组合关系 Vehicle <|-- Car Car <|-- ElectricCar ``` #### 7. **在Typora中的使用** 1. 创建代码块:```` ```mermaid ```` 2. 编写类图语法 3. Typora自动渲染为矢量图[^1] > 优势:修改文本即可更新图表,无需切换工具 #### 8. **最佳实践建议** 1. **命名规范**:类名使用帕斯卡命名法`MyClass` 2. **关系注释**:用`//`添加关系说明 3. **布局优化**: ```mermaid classDiagram direction BT // 箭头方向(bottom-top) A <|-- B A <|-- C ``` 4. **复杂图拆分**:多个小图比单个大图更清晰 ### 完整应用示例 ````markdown ```mermaid classDiagram class Shape { <<abstract>> +color: string +getArea()* double } class Circle { -radius: double +getArea() double } class Rectangle { -width: double -height: double } Shape <|-- Circle Shape <|-- Rectangle ``` ```` 渲染效果: ```mermaid classDiagram class Shape { <<abstract>> +color: string +getArea()* double } class Circle { -radius: double +getArea() double } class Rectangle { -width: double -height: double } Shape <|-- Circle Shape <|-- Rectangle ``` > 通过Mermaid可以高效创建和维护类图文档,特别适合技术文档和代码注释[^1][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值