• 大小: 4KB
    文件类型: .7z
    金币: 1
    下载: 0 次
    发布日期: 2021-06-12
  • 语言: 其他
  • 标签: 无向图    路径  

资源简介

函数功能:找到图中两个节点之间的所有路径 参数说明:1、Matrix 初始矩阵,将路径矩阵的形式存储,本程序对应的是一个无向图。 2、headNode 初始节点 3、endNode 结束节点 主要的思想 利用深度优先遍历的算法 1、利用result来存放每次从栈中出栈的数据,里面很可能就是要找的路径,为什么要单独提取出来,因为包含了多条路径 2、通过设置 访问是否的变量来避免回路

资源截图

代码片段和文件信息

// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//

#include “stdafx.h“
#include   
#include 
#include   
using namespace std;

struct Node
{
int key;
int flag;
Node()
{
flag = 0;
}
};

class Graph
{
public:
vector> resultPath;
vector result;
int _maxEdgePath;
int _pointNum;

Node headNode;//起始节点  
Node endNode;//终止节点  
stack tempStack;
int pathNum;
int nPos;
vector Mark;

public:
Graph(int maxEdgePath int pointNum)
{
_maxEdgePath = maxEdgePath;
_pointNum = pointNum;
//将矩阵中的元素置为空  
for (int i = 0; i {
vector tmpresultPath;
for (int j = 0; j {
tmpresultPath.push_back(0);
}
resultPath.push_back(tmpresultPath);
result.push_back(0);
Mark.push_back(false);
}
result.push_back(0);
pathNum = 0;
nPos = 0;
}

vector CalcPath(vector> Matrix)
{
//开始节点  
headNode.key = 2;
headNode.flag = 1;

//结束节点  
endNode.key = 8;

FindAllPath(Matrix headNode endNode);
if (pathNum == 1)
return resultPath[0];
else
return result;
}

/************************************************************************/
/* 函数功能:找到图中两个节点之间的所有路径
参数说明:1、Matrix   初始矩阵,将路径矩阵的形式存储,本程序对应的是一个无向图。
2、headNode 初始节点
3、endNode  结束节点

主要的思想  利用深度优先遍历的算法
1、利用result来存放每次从栈中出栈的数据,里面很可能就是要找的路径,为什么要单独提取出来,因为包含了多条路径
2、通过设置 访问是否的变量来避免回路/
/************************************************************************/
void FindAllPath(vector> Matrix Node startNodeKey Node endNodeKey)
{
result[nPos] = startNodeKey.key;  //将当前元素放入结果集中  
Mark[startNodeKey.key - 1] = true;  //将访问标记为已访问  
nPos++;  //结果集索引加1  
while (nPos != 0)
{
int tempVal = result[nPos - 1];//获取到最前面的元素    
if (tempVal == endNodeKey.key)  //若当前元素为目标节点  
{
for (int j = 0; j {
resultPath[pathNum][j] = result[j];  //将结果集复制于最后的路径矩阵中  
}
nPos--;  //回溯至上一个节点  
result[nPos] = 0;  //结果集对应索引置为空  
pathNum++;  //路径数目加1  
Mark[endNodeKey.key - 1] = false;
break;
}
while (startNodeKey.flag<_pointNum)//利用flag来指示每次的元素的索引    
{
if (Matrix[tempVal - 1][startNodeKey.flag] == 1)
{
if (Mark[startNodeKey.flag] == false)//利用Mark来判断是否已经访问过该节点    
{
Node tempNode;
tempNode.key = startNodeKey.flag + 1;
FindAllPath(Matrix tempNode endNodeKey);//深度优先遍历算法,    
}
}
startNodeKey.flag++;//索引值相应的加一    
}

if (startNodeKey.flag == _pointNum)//如果已经是到最后的邻居,说明访问结束,    
{                           //将对应的值置为空    
nPos--;  //再次向上回溯  
startNodeKey.flag = 0;  //将节点的索引置为空  
result[nPos] = 0;  //将结果集中对应的索引置为空  
Mark[startNodeKey.key - 1] = false;  //访问之后标记为未访问。因为下面的元素已经访问结束,便于下次的访问  
break;
}
}
}
};

int main()
{
//对应无向图的矩阵
vector> Matrix;
for (int i = 0; i < 10; i++)
{

评论

共有 条评论