使用邻接矩阵存储结构,求无向图中任意两点间所有的路径和路径条数

#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;
#define Infinity 32766
#define MaxVertexNum 50

typedef struct AMGraph {
 char vex[MaxVertexNum]; 
 int arc[MaxVertexNum][MaxVertexNum]; 
 int vexnum, arcnum; 
}AMGraph;

int FindVex (AMGraph G, char v)
{
 for (int i = 0; i < G.vexnum; i++)
 {
  if (G.vex[i] == v)
  return i;
 }
return -1; 
}

void GraphCreate (AMGraph &G)
{
    cin >> G.vexnum >> G.arcnum;
    for (int i = 0; i < G.vexnum; i++)
        cin >> G.vex[i];
    for (int i = 0; i < G.vexnum; i++)
    for (int j = 0; j < G.vexnum; j++)
        G.arc[i][j] = 0; 
    char v1, v2;
    for (int k = 0; k < G.arcnum; k++)
    {
        cin >> v1 >> v2;
        int i = FindVex (G, v1);
        int j = FindVex (G, v2);
        G.arc[i][j] = G.arc[j][i] = 1;  
    }   
}

int visited[MaxVertexNum] = {0};
vector <int> v;
int pathsum = 0;
//基于DFS查找图中所有路径 
void AllPathDFS (AMGraph G, int start, int end)
{
    v.push_back (start);
    visited[start] = 1;
    
    if (start == end)
    {
        pathsum ++;
        for (int k = 0; k < v.size() - 1; k++)
            cout << G.vex[v[k]] << "->";
        cout << G.vex[v[v.size() - 1]] << endl; 
        visited[v[v.size() - 1]] = 0;
        v.pop_back ();
        return;
    }
     
    for (int j = 0; j < G.vexnum; j++)
    {
        if (visited[j] == 0 && G.arc[start][j] == 1)
        {
            AllPathDFS (G, j, end);
        }
    }

    visited[v.size() - 1] = 0;
    v.pop_back ();        

}

int main ()
{
 AMGraph G;
 GraphCreate (G);
 AllPathDFS (G, 0, 3);
 cout << "路径条数: " << pathsum << endl; 
return 0;
}

e601a060df9b44e4a80c7f65ee13ce7b.png

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

关淳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值