邻结矩阵的建立和 BFS,DFS;;

邻结矩阵比较简单,, 它的BFS,DFS, 两种遍历也比较简单,一个用队列, 一个用数组即可!!!但是邻接矩阵极其浪费空间,尤其是当它是一个稀疏矩阵的时候!!!---------------------------------------------------------------------------------------------------------------------------------------//邻接矩阵的建立和 其BFS, DFS, 遍历
#include <cstdio>
#include <cstdlib>
//#define _OJ_

int visit[100];
int cnt = 0;
typedef struct Graph1
{
    int nv;
    int ne;
    int a[100][100];
} Graph1, *Graph;           //建立一个图含顶点, 边, 和邻接矩阵

Graph
creat_graph(void)
{
    Graph g;
    int i, j;
    int v1, v2;
    g = (Graph) malloc (sizeof(Graph1));
    scanf("%d %d", &g->nv, &g->ne);
    for(i = 0;i < g->nv; i++) {
        for(j = 0;j < g->nv; j++) {
        g->a[i][j] = 0;
         }
     }                 //对邻结矩阵赋初始值

     for(i = 0;i < g->ne; i++) {
     scanf("%d %d", &v1, &v2);
     g->a[v1][v2] = 1;
     g->a[v2][v1] = 1;
      }               //建立一个无向矩阵

    return g;
}

void
DFS(Graph g, int i)
{
    int j;
    // lif(cnt == g->nv - 1)
    // printf("%d\n", i);
    // else {             //此地有一个小技巧就是判断什么时候结束?
    // printf("%d ", i);  //用一个全局变量cnt 由于每一个点遍历一次
    // cnt++;            cnt == g->nv - 1 时结束;用此处理最后一个不要空格和换行
    // }
    printf("%d ", i);
    visit[i] = 1;

    for(j = 0;j < g->nv; j++) {
    if(g->a[i][j] == 1 && visit[j] == 0)
        DFS(g, j);
     }
}

void
DFS_travers(Graph g)
{
    int i;
    for(i = 0;i < g->nv; i++)
    visit[i] = 0;

    for(i = 0;i < g->nv; i++) {
        if(visit[i] == 0)
        DFS(g, i);
     }
}

typedef struct Queue1
{
    int top;
    int base;
    int *elem;
} Queue1, *Queue;

Queue
creat_Queue(void)
{
    Queue q;
    q = (Queue) malloc (sizeof(Queue1));
    q->elem = (int*) malloc (100 * sizeof(int));
    q->base = q->top = 0;
    return q;
}

int
isempty(Queue q)
{
    if(q->base == q->top)
        return 1;
    else
        return 0;
}

void
Enqueue(Queue q, int data)
{
    q->elem[q->top++] = data;
}

int
Dequeue(Queue q)
{
    return q->elem[q->base++];
}

void
BFS(Graph g, int v)
{
    int i, j;
    Queue q;
    q = creat_Queue();
    printf("%d ", v);
    visit[v] = 1;
    Enqueue(q, v);

    while (isempty(q) != 1) {
      i = Dequeue(q);

      for(j = 0;j < g->nv; j++) {
      if(g->a[i][j] && visit[j] == 0 ) {
            printf("%d ", j);   //把整排先全都遍历完,在遍历其它的
            visit[j] = 1;       //每次先遍历在入队
            Enqueue(q, j);
      }
    }
   }

}

void
BFS_travers(Graph g)
{
    int i;
    for(i = 0;i < g->nv; i++)
    visit[i] = 0;

    for(i = 0;i < g->nv; i++) {
    if(visit[i] == 0)
        BFS(g, i);
     }
}

int main(int argc, char const *argv[]) {
#ifndef _OJ_  //ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
#endif

    Graph g;
    g = creat_graph();
    DFS_travers(g);
    printf("\n");
    BFS_travers(g);

    return 0;
}
时间: 2024-12-20 23:00:19

邻结矩阵的建立和 BFS,DFS;;的相关文章

HDU 1254 (经典游戏)推箱子 BFS+dfs

Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推箱子而不能拉箱子,因此如果箱子被推到一个角上(如图2)那么箱子就不能再被移动了,如果箱子被推到一面墙上,那么箱子只能沿着墙移动. 现在给定房间的结构,箱子的位置,搬运工的位置和箱子要被推去的位置,请你计算出搬运工至少要推动箱子多少格. Input 输入数据的第一行是一个整数T(1<=T<=20),代表测试

SDUT--找朋友--BFS&amp;&amp;DFS

找朋友 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 X,作为户外运动的忠实爱好者,总是不想呆在家里.现在,他想把死宅Y从家里拉出来.问从X的家到Y的家的最短时间是多少. 为了简化问题,我们把地图抽象为n*n的矩阵,行编号从上到下为1 到 n,列编号从左到右为1 到 n.矩阵中'X'表示X所在的初始坐标,'Y'表示Y的位置 , '#'表示当前位置不能走,' * '表示当前位置可以通行.X每次只能向上下左右的相邻的 '*' 移

HDU ACM 1044 Collect More Jewels BFS+DFS

题意:在一个迷宫中,有一些宝物,从起点走到终点,问在给定的时间内,到达终点后所能拾取珠宝的最大价值. 分析(BFS+DFS): 1.求入口到第一个取宝物的地方的最短距离 2.求第i个取宝物的地方到第i+1个取宝物的地方的最短距离 3.求第n个取宝物的地方到出口的最短距离 4.保证以上3点能在时间L内实现的情况下,取得的宝石价值最大. BFS特点:对于解决最短或最少问题特别有效,而且寻找深度小,但缺点是内存耗费量大(需要开大量的数组单元来存储状态) DFS特点:对于解决遍历和求所有问题有效,对于问

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

三种建图方式,邻接矩阵.前向星(边表集).邻接链表! 耗时一晚上 ,好好研究了一下 前向星,因为我的指针用的实在是很烂,所以还是 入赘 前向星吧. 问了学长,看了大牛们的博客,终于有点收获了,个人认为 前向星Very Well. 前向星 建图方法: 以储存边的方式来储存图.在构造图时,把边存放在数组里,不需使用指针,只需一个 next  即可是整个图构建完成 . 适用条件: 点集特别多的稀疏图,边数多且繁杂,开邻接矩阵会浪费大量内存. 时间复杂度: O(m),并不比邻接链表差. #include

UVALive - 6455 Stealing Harry Potter&#39;s Precious (bfs+dfs)

https://cn.vjudge.net/problem/UVALive-6455 题目大意:题目上给出一个地图,其中@是人在地图上的出发点,#是墙,' . '是路.然后给出几个点,这些点表示财宝的所在地.问人是否能够得到所有的宝藏,如果能够的话给出所有的宝藏的最短的路径. 解题思路:由于只有最多4个宝藏所在地,所以只要用bfs找出出发点和财宝所在地距离到达其他点的步数.因为最多只有4个宝藏,所以可以暴力找出出发点到所有宝藏的最短距离. 暴力代码: 1 #include<stdio.h> 2

Collect More Jewels(hdu1044)(BFS+DFS)

Collect More Jewels Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6857    Accepted Submission(s): 1592 Problem Description It is written in the Book of The Lady: After the Creation, the cruel

hdu 4771 Stealing Harry Potter&#39;s Precious (2013亚洲区杭州现场赛)(搜索 bfs + dfs) 带权值的路径

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4771 题目意思:'@'  表示的是起点,'#' 表示的是障碍物不能通过,'.'  表示的是路能通过的: 目的:让你从 '@' 点出发,然后每个点只能走一次,求出最小的距离: 解题思路:先用 bfs 求解出任意两点之间的距离,用 ans[i][j],表示点 i 到点  j 的距离: 然后用 dfs 递归求出从起点经过所有点的距离中,比较出最小的: AC代码: 1 #include<iostream>

POJ 1130(一道纯水,bfs+dfs)

POJ 1130 大概题意:给出一副图,求从起点到终点 (0->ET) 必须经过的一点. 我的思路:首先DFS求出经过每点的次数,必过的一点的次数一定最高,但是就这样吗?有可能有多个必过的点,所以还要找出离ET最近的点,这里就利用BFS逐层搜索的性质求每点到ET的距离. #include<iostream> #include<cstdio> #include<string.h> #include<iomanip> #include<queue&g

BFS/DFS算法介绍与实现(转)

广度优先搜索(Breadth-First-Search)和深度优先搜索(Deep-First-Search)是搜索策略中最经常用到的两种方法,特别常用于图的搜索.其中有很多的算法都用到了这两种思想,比如:Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想.BFS的思想:从一个图的某一个顶点V0出发,首先访问和V0相邻的且未被访问过的顶点V1.V2.--Vn,然后依次访问与V1.V2--Vn相邻且未被访问的顶点.如此继续,找到所要找的顶点或者遍历完整个图.由此