有关于图的存储

邻接矩阵

int G[MAXN][MAXN];          //MAXN为点的数目

memset(G, 0x3f3f3f3f, sizeof(G));       //适合求最短路等

memset(G, 0, sizeof(G));                //适合传递闭包

适合多源最短路Foyed、求图的传递闭包等。

数组邻接表

struct Edge {
    int fr, to, pw, ne;     //分别为边的起点、终点、边权、上一条相同起点的边
    Edge(int fr = 0, int to = 0, int pw = 0, int ne = 0) :
        fr(fr), to(to), pw(pw), ne(ne) {}
} edge[MAXM];           //MAXM为边的数目

int head[MAXN];         //MAXN为点的数目,head数组记录每个点的最后一条边。
int sume;               //sume为总的边数。

void addEdge(int x, int y, int z) {
    edge[++sume] = Edge(x, y, z, head[x]);
    head[x] = sume;
}

for (int u = head[x]; u; u = edge[u].ne) {
    //搜索...
}

比较费空间,但是比较好理解。
容易进行DFS,BFS,求各种图论问题等。

指针邻接链表

struct Node {
    struct Edge *fe;
    //各种变量(vis,dis之类—)
} node[MAXN];

struct Edge {
    Node *fr, *to;
    Edge *ne;
    Edge(Node *const fr, Node *const to, int pw) :
        fr(fr), to(to), pw(pw), ne(fr->fe) {}
};

void addEdge(const int &x, const int &y, const int &z) {
    node.fe = new Edge(&node[x], &node[y], z);
}

for (Edge *e = x->fe; e; e = e->ne) {
    //搜索...
}

//省空间而且比较简洁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值