无向图的遍历


****1.DFS  2.BFS  3.退出****
输入你的选择
1
输入图的点数和边数
3 3
输入图的点
1 2 3
依次输入边的两个端点
0 1
0 2
1 2
输入想要遍历的起点
0
广度优先遍历为:1 2 3
输入你的选择
2
输入图的点数和边数
3 3
输入图的点
1 2 3
依次输入边的两个端点
0 1
0 2
1 2
输入想要遍历的起点
1
深度优先遍历为:2 1 3
输入你的选择
3
退出程序
*/

#include<iostream>
#include<algorithm>
using namespace std;
const int maxsize=100;
bool visited[maxsize];
template <class Datatype>
class grahf
{
    public:
        grahf(Datatype a[],int n,int e);
        ~grahf();
        void BFS(int v);
        void DFS(int v);
    private:
        int bianshu,dianshu;
        int bian[maxsize][maxsize];
        Datatype dian[maxsize];
};
template <class Datatype>
grahf <Datatype>::~grahf()
{
    dianshu=0;
    bianshu=0;
}
template <class Datatype>
grahf <Datatype>::grahf(Datatype a[],int n,int e)
{
    int i,j,k;
    dianshu=n;
    bianshu=e;
    for(i=0;i<dianshu;i++)
    {
        dian[i]=a[i];
        visited[i]=
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个经典的图论问题,可以使用 Dijkstra 算法来解决。下面是使用 C 语言实现 Dijkstra 算法求解无向图遍历完所有点走过的最短路径的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <limits.h> #define MAX_VERTICES 100 #define INF INT_MAX typedef struct Graph { int V; // 顶点数 int E; // 边数 int adj[MAX_VERTICES][MAX_VERTICES]; // 邻接矩阵 } Graph; void init_graph(Graph* G, int V) { G->V = V; G->E = 0; for (int i = 0; i < G->V; i++) { for (int j = 0; j < G->V; j++) { G->adj[i][j] = INF; } } } void add_edge(Graph* G, int u, int v, int w) { G->adj[u][v] = w; G->adj[v][u] = w; G->E++; } void dijkstra(Graph* G, int s, int dist[]) { int visited[MAX_VERTICES] = {0}; for (int i = 0; i < G->V; i++) { dist[i] = INF; } dist[s] = 0; for (int i = 0; i < G->V; i++) { int u = -1; for (int j = 0; j < G->V; j++) { if (!visited[j] && (u == -1 || dist[j] < dist[u])) { u = j; } } visited[u] = 1; for (int v = 0; v < G->V; v++) { if (G->adj[u][v] != INF) { if (dist[u] + G->adj[u][v] < dist[v]) { dist[v] = dist[u] + G->adj[u][v]; } } } } } int main() { Graph G; int V = 6; init_graph(&G, V); add_edge(&G, 0, 1, 10); add_edge(&G, 0, 2, 3); add_edge(&G, 1, 2, 1); add_edge(&G, 1, 3, 2); add_edge(&G, 2, 1, 4); add_edge(&G, 2, 3, 8); add_edge(&G, 2, 4, 2); add_edge(&G, 3, 4, 7); add_edge(&G, 3, 5, 1); add_edge(&G, 4, 5, 5); int dist[MAX_VERTICES]; dijkstra(&G, 0, dist); printf("最短路径长度为:%d\n", dist[V - 1]); return 0; } ``` 这个示例代码中,我们使用了邻接矩阵来表示图,并用 Dijkstra 算法求出了从起点 0 到终点 5 的最短路径长度。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值