Firetruck UVA - 208(并查集+dfs)

本文介绍了一种使用并查集预处理连通性,并结合深度优先搜索(DFS)来找出所有从起点到终点的字典序路径的方法。该方法首先通过并查集判断起点与终点是否连通,若连通,则利用DFS遍历并输出所有可能的路径。

题目大意

给出终点,然后给出哪两个点连通,注意这里的连通是没有方向的那种连通。然后按字典序输出所有可能从1到终点的路径。

思路

由于1可能到达不了终点,盲目暴力肯定会超时,所以可以先用并查集看1和终点是否连通,然后在开始用dfs打印路径。这里的dfs写法是看一位大佬的写法才豁然开朗。

代码

#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;

const int maxn = 21;
int pre[maxn];                   // 父节点 
bool G[maxn][maxn];              // 记录两点是否连通
int ans;  
int vis[maxn];
int en;                          // 最终要到达的目标位置
vector<int> res;                 // 保存路径结果

int find(int x) {
    int r = x;
    int temp;
    while(r != pre[r])  {
        r = pre[r];
    }
    while(x != r) {              // 路径压缩
        temp = pre[x];
        pre[temp] = r;           // 把每一个都连到根节点
        x = temp;
    }
    return r;
}

void dfs(int cur)
{
    if (cur == en){
        ans++;
        for (int i = 0; i != res.size(); i++)
            printf("%d%c", res[i], i == res.size()-1 ? '\n' : ' ');
        return;
    }
    for (int i = 2; i <= 21; i++) {
        if (!vis[i] && G[cur][i]) {
            vis[i] = 1;
            res.push_back(i);
            dfs(i);
            vis[i] = 0;
            res.pop_back();
        }
    }
}

int main() {
    freopen("input.txt", "r", stdin);
    int x, y;
    int kase = 0;
    while(~scanf("%d", &en)) {
        for(int i = 1; i <= maxn; i++) {
            pre[i] = i;
        }
        memset(G, false, sizeof(G));
        while(scanf("%d%d", &x, &y) && x && y) {
            G[x][y] = G[y][x] = true;
            int rx = find(x);
            int ry = find(y);
            if (rx != ry) {
                pre[rx] = ry;   
            }
        }
        ans = 0;
        printf("CASE %d:\n", ++kase);
        int fen = find(en);
        int fbe = find(1);
        if (fbe != fen) {
            goto END;     // 用并查集防止超时
        }
        memset(vis, 0, sizeof(vis));
        res.clear();
        res.push_back(1);
        vis[1] = 1;
        dfs(1);
        END:
        printf("There are %d routes from the firestation to streetcorner %d.\n", ans, en);
    }
    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、付费专栏及课程。

余额充值