跳转至

Graph 类

用于提供存放图的容器,并支持与生成数据相关的函数。

Warning

该类多用作基类,不建议大家直接使用

自定义生成的时候,请尽量使用继承的方式而不是创建实例。

公开的成员

返回类型 函数定义
Graph( int verCount, bool undirectedMap = false, bool weightedMap = false, bool muiltiedgeCheck = false, bool loopCheck = false )
bool add_edge(int from, int to)
bool add_edge(int from, int to, int weight)
void clear(void)
int GetEdgeCount(void)
void Output(bool shuffleOutput = true)
~Graph(void)

详细注解

Graph 构造

描述:

Graph 类的构造函数。

语法:

1
2
3
4
5
6
7
Graph::Graph(
    [in]            int verCount,
    [in, optional]  bool undirectedMap,
    [in, optional]  bool weightedMap,
    [in, optional]  muiltiedgeCheck,
    [in, optional]  loopCheck
);

参数:

  • verCount:图的点数
  • undirectedMap:无向图开关,默认为有向图(false
  • weightedMap:带权图开关,默认为不带权(false
  • muiltiedgeCheck:重边检查开关,默认为关闭(false
  • loopCheck:自环检查开关,默认为关闭(false

add_edge 方法

描述:

用于添加一条边,边的类型请参照构造函数中 weightedMap 部分。

语法:

不带权边重载:

1
2
3
4
bool Graph::add_edge(
    [in]    int from,
    [in]    int to
);

带边权重载:

1
2
3
4
5
bool Graph::add_edge(
    [in]    int from,
    [in]    int to,
    [in]    int weight
);

参数:

  • from:边的起点
  • to:边的终点
  • weight:边的边权(Override!!

返回:

若边成功添加,则返回 true

否则返回 false

警告:

该函数的两个重载完全不同,请注意不要混淆, 若不带权图使用了带权图的 add_edge,则会触发断言失败,反之亦然。


clear 方法

描述:

用于清空当前容器内的数据。

语法:

1
void Graph::clear(void);

警告:

注意,clear 并不会自动缩放内存的使用,也就是说,clear 方法仅仅是起到了清空的作用,其并没有释放占用的内存。


GetEdgeCount 方法

描述:

用于获取当前容器内拥有多少条边。

语法:

1
int Graph::GetEdgeCount(void);

返回:

当前容器的边数。


Output 方法

描述:

用于输出当前容器内的边。

语法:

1
2
3
void Output(
    [in, optional]  bool shuffleOutput
);

参数:

  • shuffleOutput:打乱输出开关,默认为启用(true

使用示例

实现生成一张不带权的无向基环树:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include "genlib.h"
using namespace Generator;
class BaseRingTree : protected Graph
{
public:
    BaseRingTree(int verCount)
        : Graph(verCount, true, false, true, true)
    {
        vertexCount = verCount;
    }
    void Generate()
    {
        for(int i=2;i<=vertexCount;++i)
            add_edge(i, rnd.irand(1, i-1));
        int cnt = 1;
        int from, to;
        while(cnt) {
            from = rnd.irand(1,vertexCount);
            to = rnd.irand(1,vertexCount);
            cnt -= add_edge(from, to);
        }
    }
    void output(bool shuffleOutput = true)
    {
        Output(shuffleOutput);
    }
private:
    Random rnd;
    int vertexCount;
}
int main()
{
    RedirectToFile("in.in");
    BaseRingTree brt(20);
    brt.Generate();
    brt.output();
    return 0;
}

PS:当然,我们也为您实现了基环树,计划在下个版本发布(大雾)