Adjacency List邻接表

对于边数相对顶点较少的图,我们使用一种存储结构的方式:邻接表(Adjacency List),即数组与链表相结合的存储方法。

无向图带权值的邻接表结构:


TREE

建树:

for(i=0; i<n; i++)
{
    int u, v, w;
    scanf("%d%d%d", &u, &v, &w);
    s[cnt].to=v;
    s[cnt].w=w;
    s[cnt].next=head[u];
    head[u]=cnt++;

    s[cnt].to=u;
    s[cnt].w=w;
    s[cnt].next=head[v];
    head[v]=cnt++;
}
TREE

DFS遍历:

void DFS(int u)
{
    vis[u]=true;
    for(int i=head[u]; i!=-1; i=s[i].next)
    {
        int v=s[i].to;
        int w=s[i].w;
        printf("%d %d\n", v, w);
        if(vis[v]==false) DFS(v);
    }
}
DFS

代码:

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

struct node
{
    int to, next, w;
} s[10005];

int head[10005];
bool vis[10005];
void DFS(int u)
{
    vis[u]=true;
    for(int i=head[u]; i!=-1; i=s[i].next)
    {
        int v=s[i].to;
        int w=s[i].w;
        printf("%d %d\n", v, w);
        if(vis[v]==false) DFS(v);
    }
}


int main()
{
    int i, n, cnt=1;
    scanf("%d", &n);
    memset(head, -1, sizeof(head));
    memset(vis, false, sizeof(vis));
    for(i=0; i<n; i++)
    {
        int u, v, w;
        scanf("%d%d%d", &u, &v, &w);
        s[cnt].to=v;
        s[cnt].w=w;
        s[cnt].next=head[u];
        head[u]=cnt++;

        s[cnt].to=u;
        s[cnt].w=w;
        s[cnt].next=head[v];
        head[v]=cnt++;
    }
    DFS(1);
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 内容整理于鱼c工作室教程 1. 图的基本概念 1.1 图的概念 图(Graph)是由顶点的有穷非空集合和顶点之间边...
    阿阿阿阿毛阅读 8,591评论 0 2
  • 图是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合...
    开心糖果的夏天阅读 4,444评论 0 9
  • 第一章 绪论 什么是数据结构? 数据结构的定义:数据结构是相互之间存在一种或多种特定关系的数据元素的集合。 第二章...
    SeanCheney阅读 11,125评论 0 19
  • 图是一种比线性表和树更复杂的数据结构,在图中,结点之间的关系是任意的,任意两个数据元素之间都可能相关。图是一种多对...
    Alent阅读 6,923评论 1 22
  • 睡前故事——至尊宝 1) 长夜漫漫,无心睡眠。 我叫至尊宝。我一直想不明白,为什么我爹妈会给我取这么奇怪的名字...
    楠令阅读 4,050评论 0 0

友情链接更多精彩内容