建图方式一 之 ”前向星“ BFS&&DFS 简单应用

三种建图方式,邻接矩阵、前向星(边表集)、邻接链表!

耗时一晚上 ,好好研究了一下 前向星,因为我的指针用的实在是很烂,所以还是 入赘 前向星吧。

问了学长,看了大牛们的博客,终于有点收获了,个人认为 前向星Very Well。

前向星

建图方法:

以储存边的方式来储存图。在构造图时,把边存放在数组里,不需使用指针,只需一个
next  即可是整个图构建完成 。

适用条件:

点集特别多的稀疏图,边数多且繁杂,开邻接矩阵会浪费大量内存。

时间复杂度:

O(m),并不比邻接链表差。

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define mae 10010 // 最大边数
#define mav 110   // 最大顶点数
using namespace std;

struct EdgeNode{
    int v;
    int w;
    int next;
}g[mae];

int head[mae];
int t = 1;//edgenum 作用
int n, m;

bool visdfs[mav];
bool visbfs[mav];
void init()    //初始化
{
    memset(head, 0, sizeof(head));
    memset(visbfs,0,sizeof(visbfs));
    memset(visdfs,0,sizeof(visdfs));
    t = 1;
}

void add(int a,int b,int c)//加边
{
    g[t].v = b;  //当年节点 a指向b
    g[t].w = c;   // a->b 边的权值是 c
    g[t].next = head[a];  // next指向 上一条以a为起点的边
    head[a] = t;  //head[a] 表示以a为起点的最后输入的边的 编号
    t++;          // 给每一条以构建的边 制定编号(edgenum)
}

void Print()
{
    int k,i;
    for(i = 1; i <= n; i++)
    {
        if(head[i])//找边
        {
            for(k = head[i]; k != 0; k = g[k].next)
          {
            printf("%d->%d %d\n", i, g[k].v, g[k].w);
          }
        }
    }
}

void DFS(int x)
{
    visdfs[x] = true;
 printf("%d\n",x);
    for(int i = head[x]; i != 0; i = g[i].next)
    {
        if(!visdfs[g[i].v])
        {
            DFS(g[i].v);
        }
    }

}

void BFS(int x)
{
    int q[mav];//队列
    int jin = 0,chu=0,st;
    q[jin++] = x;
    visbfs[x] = true;//标记
    while(chu < jin)
    {
        st = q[chu++];
        printf("%d\n",st);
        for(int k = head[st]; k != 0; k = g[k].next)
        {
            if(!visbfs[g[k].v])
            {
                visbfs[g[k].v] = true; //标记
                q[jin++] = g[k].v;
            }
        }
    }
}

int main()
{
    int U,V,W,in;
    while(~scanf("%d%d",&n,&m))
    {
        init();
        for(int i = 1; i <= m; i++)
        {
            scanf("%d%d%d",&U,&V,&W);
            add(U,V,W);
        }
        in = 1;//此处以1为例开始搜索
        puts("建图为");
        Print();
        puts("dfs访问结果:");
        DFS(in);
        printf("-----------\n");
        puts("bfs访问结果:");
        BFS(in);
    }
    return 0;
}

建图方式一 之 ”前向星“ BFS&&DFS 简单应用,布布扣,bubuko.com

时间: 2024-08-26 03:23:33

建图方式一 之 ”前向星“ BFS&&DFS 简单应用的相关文章

建图方式之“邻接链表” BFS搜索

继续校赛前的建图任务,当时只写了DFS遍历,今天把BFS也写了一下. #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> const int maxe = 10001; using namespace std; struct node{ int to,w; node *next; }*head[maxe];

建图方式一 之 “邻接链表”

唉o(︶︿︶)o ,我果然还是玩不了 邻接链表,捣鼓了一晚上,只实现了 DFS的搜索 ,BFS 至今还不会,快回宿舍了,等校赛后再研究吧 邻接链表: n个顶点m条边的无向图,表示中有 n 个顶点表结点和 2m 个边表结点.(也就是说,每条边 u-v 在邻接表 中出现两次:一次在关于u的邻接表中,另一次在关于v的邻接表中)PS:注意是无向图,有向图时,DFS搜索会漏点,也就是说只能访问到 当前点 指向 的  点: 优点: 便于查找任一顶点的关联边及关联点,查找运算的时间复杂性平均为O(m/n):

图的存储结构——前向星

前向星也是一种通过存储边信息的方式存储图的数据结构.他的构造方式非常简单,读入每条边的信息,将边存放在数组当中,把数组中的按照起点顺序排序,前向星就构造完成了.为了查询方便,经常会有一个数组存储起点为vi的第一条边的位置. 所需的数据结构如下: 1 int head[maxn]; 2 3 struct NODE{ 4 int from; 5 int to; 6 int w; 7 }; 8 NODE edge[maxm]; 存储 将所有边的信息读入,按照边的起点排序,如果起点相同,对于相同起点,如

链式前向星BFS

采用链式前向星的BFS: #include <iostream> #include <cmath> #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> #include <queue> using namespace std; typedef long long LL; const int maxN = 100 + 3;

链式前向星上DFS(Pants On Fire)

Pants On Fire 时间限制: 1 Sec  内存限制: 128 MB提交: 161  解决: 66[提交] [状态] [命题人:admin] 题目描述 Donald and Mike are the leaders of the free world and haven’t yet (after half a year) managed to start a nuclear war. It is so great! It is so tremendous!Despite the gre

【前向星】链式前向星实现以及它的遍历

深度理解链式前向星 链式前向星的构成由一个结构体(包括目标点.边权值和下一个同起点的边)和head数组(用于存放某点的第一条出边) 必要的时候还可以添加一个统计入度的数组,因为进行BFS DFS的时候是依靠点的出度和出边的邻接关系来进行的.假如有多于一个点的入度为0,那么将只能遍历到其中一个点以及往后的内容. 对于链式前向星:链式前向星每添加一条边就会更新head数组,使得head数组存放的总是最新添加的某点的出边,此出边的next总指向head数组之前存放的出边的序号. 我们输入边的顺序为:

POJ -1062 昂贵的聘礼(前向星 &amp;&amp; SPFA)

题目链接:昂贵的聘礼 这个题对自己收获挺大的,模板要自己经常敲,才能理解,要自己经常敲,从能温故而知新,自己以前总结的建图方式,做题的时候要会用,要敢用,否则==NULL. 题意对于交换条件描述的有点不清楚,这里解释一下,假设8件物品,等级差距不能超过3,酋长LV 5,所以可以进行交换的LV区间是[2,5][3,6][4,7][5,8],不必考虑题目那一句,"但是如果他和某个地位较低的人进行了交易,地位较高的的人不会再和他交易,他们认为这样等于是间接接触,反过来也一样".越看越晕,只要

前向星和链式前向星

前向星和链式前向星 1.前向星 前向星是以存储边的方式来存储图,先将边读入并存储在连续的数组中,然后按照边的起点进行排序,这样数组中起点相等的边就能够在数组中进行连续访问了.它的优点是实现简单,容易理解,缺点是需要在所有边都读入完毕的情况下对所有边进行一次排序,带来了时间开销,实用性也较差,只适合离线算法.图一-2-4展示了图一-2-1的前向星表示法. 2.链式前向星(就是数组模拟链表) 链式前向星和邻接表类似,也是链式结构和线性结构的结合,每个结点i都有一个链表,链表的所有数据是从i出发的所有

POJ 3020-Antenna Placement(二分图匹配_最小路径覆盖+前向星构图)

Antenna Placement Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6930   Accepted: 3439 Description The Global Aerial Research Centre has been allotted the task of building the fifth generation of mobile phone nets in Sweden. The most st