图论----搜索

本文介绍了图论的存储结构,及两种搜索方式,即DFS和BFS.

文章目录

DFS

#include<stdio.h>
typedef int EdgeType;
typedef char VertexType;
#define MAXVEX 100
#define INFINITY 65535
int visited[MAXVEX];

typedef struct
{
    VertexType vexs[MAXVEX];
    EdgeType arc[MAXVEX][MAXVEX];
    int numVertexs, numEdges;
}MGraph;

void CreateMGraph(MGraph *G)
{
    int row = 0, column = 0, value = 0;
    printf("请输入顶点数和边数\n");
    scanf("%d %d",&G->numVertexs, &G->numEdges);
    getchar();
    printf("请输入顶点\n");
    for (int i = 0; i < G->numVertexs; ++i)
    {
        scanf("%c",&G->vexs[i]);
        getchar();
    }
    for (int i = 0; i < G->numVertexs; ++i)
    {
        for (int j = 0; j < G->numVertexs; ++j)
        {
            G->arc[i][j] = INFINITY;
        }
    }
    printf("请输入边\n");
    for (int i = 0; i < G->numEdges; ++i)
    {
        scanf("%d %d %d",&row, &column, &value);
        G->arc[row][column] = value;
        G->arc[column][row] = value; //无向图,若是有向图可以不添加
    }
}

void show(MGraph *g)
{
    for (int i = 0; i < g->numVertexs; ++i)
    {
        for (int j = 0; j < g->numVertexs; ++j)
        {
            printf("%7d",g->arc[i][j]);
        }
        printf("\n");
    }
}

void DFSTraverse(int k, MGraph *g)
{
    visited[k] = 1;
    printf("%c\t",g->vexs[k]);
    for (int j = 0; j < g->numVertexs; ++j)
    {
        if (!visited[j] && g->arc[k][j] != 0 && g->arc[k][j] != INFINITY)
        {
            DFSTraverse(j,g);
        }
    }
}

void DFS(MGraph *g)
{
    for (int i = 0; i < g->numVertexs; ++i)
    {
        visited[i] = 0;
    }
    for (int i = 0; i < g->numVertexs; ++i)
    {
        if (!visited[i])
        {
            DFSTraverse(i,g);
        }
    }
}

int main()
{
    freopen("5.txt","r",stdin);
    MGraph *g = (MGraph*)malloc(sizeof(MGraph));
    CreateMGraph(g);
    DFS(g);
    return 0;
}

5.txt:

9 14
A B C D E F G H I
0 1 10
0 5 11
1 2 18
1 6 16
1 8 12
2 3 22
2 8 8
3 4 20
3 7 16
3 8 21
4 5 26
4 7 7
5 6 17
6 7 19

BFS

因为bfs算法用到了队列,如果用c语言的话,还需要建立队列的数据结构,所以这里采用c++来编写。

#include<bits/stdc++.h>

using namespace std;
typedef int EdgeType;
typedef char VertexType;
#define MAXVEX 100
#define INFINITY 65535
int visited[MAXVEX];

typedef struct
{
    VertexType vexs[MAXVEX];
    EdgeType arc[MAXVEX][MAXVEX];
    int numVertexs, numEdges;
}MGraph;

void CreateMGraph(MGraph *G)
{
    int row = 0, column = 0, value = 0;
    printf("请输入顶点数和边数\n");
    scanf("%d %d",&G->numVertexs, &G->numEdges);
    getchar();
    printf("请输入顶点\n");
    for (int i = 0; i < G->numVertexs; ++i)
    {
        scanf("%c",&G->vexs[i]);
        getchar();
    }
    for (int i = 0; i < G->numVertexs; ++i)
    {
        for (int j = 0; j < G->numVertexs; ++j)
        {
            G->arc[i][j] = INFINITY;
        }
    }
    printf("请输入边\n");
    for (int i = 0; i < G->numEdges; ++i)
    {
        scanf("%d %d %d",&row, &column, &value);
        G->arc[row][column] = value;
        G->arc[column][row] = value; //无向图,若是有向图可以不添加
    }
}

void BFS(MGraph *g)
{
    for (int i = 0; i < g->numVertexs; ++i)
    {
        visited[i] = 0;
    }
    queue<int> q;
    q.push(0);
    visited[0] = 1;
    while(!q.empty())
    {
        int k = q.front();
        cout<<g->vexs[k]<<"   ";
        q.pop();
        for (int m = 0; m < g->numVertexs; ++m)
        {
            if (g->arc[k][m] != 0 && g->arc[k][m] != INFINITY && !visited[m])
            {
                visited[m] = 1;
                q.push(m);
            }
        }
    }
}

void show(MGraph *g)
{
    for (int i = 0; i < g->numVertexs; ++i)
    {
        for (int j = 0; j < g->numVertexs; ++j)
        {
            printf("%7d",g->arc[i][j]);
        }
        printf("\n");
    }
}

int main()
{
    freopen("5.txt","r",stdin);
    MGraph *g = (MGraph*)malloc(sizeof(MGraph));
    CreateMGraph(g);
    BFS(g);
    //show(g);
    return 0;
}

这里的5.txt和上面的一样。

这就是对图论中搜索的总结,分享一道利用bfs的题目

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用并查集解决图论-桥问题的C++代码,不使用Tarjan算法: ```c++ #include <iostream> #include <vector> using namespace std; const int MAXN = 1e5 + 5; int n, m, cnt, ans; int fa[MAXN], low[MAXN], dfn[MAXN]; vector<int> vec[MAXN]; int find(int x) { if (fa[x] == x) return x; return fa[x] = find(fa[x]); } void Union(int u, int v) { int x = find(u); int y = find(v); if (x != y) fa[x] = y; } void dfs(int u, int pre) { low[u] = dfn[u] = ++cnt; for (int i = 0; i < vec[u].size(); i++) { int v = vec[u][i]; if (!dfn[v]) { dfs(v, u); low[u] = min(low[u], low[v]); if (low[v] > dfn[u]) { ans++; Union(u, v); } } else if (v != pre) { low[u] = min(low[u], dfn[v]); } } } int main() { cin >> n >> m; for (int i = 1; i <= n; i++) fa[i] = i; for (int i = 1; i <= m; i++) { int u, v; cin >> u >> v; vec[u].push_back(v); vec[v].push_back(u); } dfs(1, 0); cout << ans << endl; return 0; } ``` 该代码与使用Tarjan算法的代码相似,只是将Tarjan算法中的递归调用改为了深度优先搜索。在`dfs`函数中,`low[u]`表示u能够到达的最小dfn值,`dfn[u]`表示u的dfs序,`pre`表示u的父亲节点。当`v`是`u`的子节点时,如果`v`还没有被访问过,就递归调用`dfs`函数,并更新`low[u]`的值。如果`low[v] > dfn[u]`,则说明(u, v)是桥,合并u和v所在的集合。如果`v`已经访问过,并且v不是u的父亲节点,就更新`low[u]`的值。 最后输出ans即可,ans表示桥的数量。 注意:此代码实现并不是最优解,仅作为参考。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值