图的路由设计和搜索路径
来源:互联网 发布:mysql数据库安装包下载 编辑:程序博客网 时间:2024/06/16 08:21
一、 定义节点对象
/**
* 节点ID
*/
private int siteId;
/**
* TOPO图ID
*/
private int topoId;
/**
* 节点名称
*/
private String name = null;
/**
* 关联的站点
*/
public List<RouteSearcherNodeInfo> relationNodes = new ArrayList<RouteSearcherNodeInfo>();
/**
* 关联的链路ID
*/
public List<List<Integer>> relationNmsPGIDS = new ArrayList<List<Integer>>();
二、 实现搜索代码
public class RouteSearcher
{
private Stack<RouteSearcherNodeInfo> stack;
private List<List<String>> resultPath = new ArrayList<List<String>>();
public RouteSearcher(Stack<RouteSearcherNodeInfo> stack)
{
this.stack = stack;
stack.clear();
}
public boolean isNodeInStack(RouteSearcherNodeInfo node)
{
Iterator<RouteSearcherNodeInfo> it = stack.iterator();
while (it.hasNext())
{
RouteSearcherNodeInfo node1 = (RouteSearcherNodeInfo)it.next();
if (node == node1)
return true;
}
return false;
}
public void savePath()
{
Object[] o = stack.toArray();
List<String> asList = new ArrayList<String>(o.length);
for (Object object : o)
{
RouteSearcherNodeInfo node = (RouteSearcherNodeInfo)object;
asList.add(node.getName());
}
resultPath.add(asList);
}
/**
* 查找路由
* @param cNode 当前查找节点
* @param pNode 前一个节点
* @param sNode 开始节点
* @param eNode 结束节点
* @return [参数说明]
*
* @return boolean [返回类型说明] 是否超找通路
* @exception throws [违例类型] [违例说明]
* @see [类、类#方法、类#成员]
*/
public boolean getPaths(RouteSearcherNodeInfo cNode, RouteSearcherNodeInfo pNode, RouteSearcherNodeInfo sNode,
RouteSearcherNodeInfo eNode)
{
RouteSearcherNodeInfo nNode = null;
if (cNode != null && pNode != null && cNode == pNode) //判断环的情况
return false;
if (cNode != null)
{
int i = 0;
stack.push(cNode); //压入当前节点
if (cNode == eNode) //递归结束条件 如果当前查找的节点为终结点,则stack中保存了一条通路
{
savePath(); //获取通路
return true; //标记找到通路
}
else
{ //如果当前节点不是目标节点,则循环找当前节点的关联节点,视图找到关联节点的每一条通路
nNode = cNode.getRelationNodes().get(i);
while (nNode != null)
{
/*
* pNode != null标记 pNode ,cNOde,nNode能组成通路,否则为断开的路,没必要处理;
* nNode == sNode标记关联节点是开始节点,开始节点没必要找通路,所有通路均由开始节点开始
* nNode == pNode标记关联节点已经所搜,没必要继续搜索
* isNodeInStack,标记nNode曾经搜索过,没必要继续搜索
*/
if (pNode != null && (nNode == sNode || nNode == pNode || isNodeInStack(nNode)))
{
i++;
if (i >= cNode.getRelationNodes().size())
nNode = null;
else
nNode = cNode.getRelationNodes().get(i);
continue;
}
//以nNode出发,看能否找到一条通路,如果找到,再找下一个节点,stack.pop()即找下一个cNode的子节点
if (getPaths(nNode, cNode, sNode, eNode) && !stack.isEmpty())
{
stack.pop();
}
//下一个子节点
i++;
if (i >= cNode.getRelationNodes().size())
nNode = null;
else
nNode = cNode.getRelationNodes().get(i);
}
stack.pop();//相对应 cNode = eNode的判断,对于当前节点来说,如果不是end节点,以为这此路不通,此节点不保存(从stack中弹出)
return false;//此路不通,return false
}
}
else
return false;
}
- 图的路由设计和搜索路径
- 图的路径搜索
- 图的搜索和最短路径-Saving James Bond
- #include和#include" "搜索路径的区别。
- angularjs和vuejs的路由用#识别路径
- spyder的工作路径和python的搜索路径
- 【python】路径搜索和搜索路径
- 图的最短路径搜索
- dll的搜索路径
- 最佳路径的搜索
- 头文件的查找方式和库的搜索路径
- 网站的视觉路径和版式设计
- MATLAB搜索路径机制和搜索顺序
- 从最小支撑树和最短路径树学习图的优先级搜索
- 静态库和共享库库的定位搜索路径
- Linux操作系统的头文件和库文件搜索路径
- Linux系统的头文件和库文件搜索路径
- Vc2005 调试打开minidump,模块和符号的搜索路径。
- php正则
- 多线程信号量PV操作初探
- 【Android UI设计与开发】第16期:滑动菜单栏(一)开源项目SlidingMenu的使用
- java URL重写技术
- 简谈“开放平台”设计中的一些感悟
- 图的路由设计和搜索路径
- Access 数据库 在64位的windows运行时,需要在编译时,编译为x86结构,既可以在32位64位的操作系统上运行
- 【POI】学习计划 第一篇
- Android项目实战--手机卫士01--启动界面
- 自己本地建网站
- String 字符串转int[]
- LeetCode - Rotate Image
- 域服务器搭建
- 修改网页转向