社区
数据结构与算法
帖子详情
有没有好的算法--快速寻找有向图中两点间的所有路径?
coolqi
2001-09-19 05:17:09
...全文
968
15
打赏
收藏
有没有好的算法--快速寻找有向图中两点间的所有路径?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
wilddragon
2001-09-22
打赏
举报
回复
好困呀
wilddragon
2001-09-21
打赏
举报
回复
天生我才必有用
wilddragon
2001-09-21
打赏
举报
回复
值得注意
coolqi
2001-09-21
打赏
举报
回复
To: starfish(海星)
世上还有你这样乐于助人的人,我真感动。同时对你的水平更是佩服!
我是北航自动控制系的,我叫程琪(男, chengqi526@263.net),希望能认识你,
以后能多向你请教。
最后请问你能允许我在毕业论文中用这个算法吗?
starfish
2001-09-21
打赏
举报
回复
这个算法的效率应该是理论上最好的了,因为要求出两点间所有的路径,必须考察每种可能(否则的话信息量不够),所以这个回溯法是唯一的方法。至于运算的速度,取决于你的图的规模和顶点的数目,这个算法的复杂度是O(VE)。内存耗光的问题一般不会出现,我试过用这个计算5000个节点的随机地图,速度还是蛮快的,一下子就出解了。该算法很简单,基本思想就是回溯,程序是我随手写的,书上可能没有,不过你可以找一些讲回溯法的书看看
ritchiex
2001-09-20
打赏
举报
回复
那好,我给你写个模型:
#include<alloc.h>
#include<stdio.h>
#include<string.h>
#define NULL 0
#define MAX 100
struct edgenode
{int no;
struct edgenode *next;
};
struct vex
{struct edgenode *first;
};
typedef struct vex adjlist; //*以上定义图的数据结构*//
int n,e; //*n是结点个数,e是边的个数*//
adjlist *g;
void initalize() //*初始化数据*//
{int i,s,t;
struct edgenode *p,*q;
printf("Enter the n and e:");
scanf("%d %d",&n,&e);
g=(adjlist *)malloc(n*sizeof(adjlist));
for(i=0;i<n;i++) g[i].first=NULL;
for(i=1;i<=e;i++)
{printf("The %d edge's start and end:",i);
scanf("%d %d",&s,&t);
p=(struct edgenode *)malloc(sizeof(struct edgenode));
q=(struct edgenode *)malloc(sizeof(struct edgenode));
p->no=s;q->no=t;
p->next=g[t].first;g[t].first=p;
q->next=g[s].first;g[s].first=q;
}
}
void path(int st,int en)
{int *visit,*stack,top,v,head=1,i;
struct edgenode *p;
visit=(int *)malloc(n*sizeof(int));
stack=(int *)malloc((n+1)*sizeof(int));
for(i=0;i<n;i++) visit[i]=0;
v=st;visit[st]=1;top=1;stack[top]=v;
do{if(head==1) {p=g[v].first;
head=0;}
else p=p->next;
if(p)
{if(visit[p->no]==0)
{visit[p->no]=1;
top++;
stack[top]=p->no;
if(p->no==en)
{for(i=1;i<=top;i++)
printf("%d ",stack[i]);
printf("\n");
visit[en]=0;
top--;
v=stack[top];
head=0;}
else {v=stack[top];
head=1;}
} //*进栈和判断*//
}
else {visit[stack[top--]]=0; //*出栈*//
if(top)
{p=g[stack[top]].first;
while(p->no!=v) p=p->next;
v=stack[top];
head=0;}
}
}while(top);
}
main()
{int st,en; //*st是要判断有路径的起点,en是终点*//
initalize();
printf("Enter the start and the end:");
scanf("%d %d",&st,&en);
path(st,en);
getchar();
getchar();
}
注意:n个结点的顺序是0,1,2,3,4....n-1,输入时请注意.
coolqi
2001-09-20
打赏
举报
回复
To: ritchiex:
真的好感谢你!
但抱歉,本人水平有限,这个算法我还是不太懂!
1。这里要求手工输入节点和边,但我的程序要求根据电路图的网络表自动读取这些信息。
2。 p->next=g[t].first;g[t].first=p;
q->next=g[s].first;g[s].first=q;
这两句是不是解决边的方向问题?
3。请你看一下starfish在http://www.csdn.net/expert/TopicView.asp?id=253130中所写的深度优先搜索算法是否能满足我的要求?
本人是学电气的,但课题是研究图论算法,所以请各位高手多多帮忙!
coolqi
2001-09-20
打赏
举报
回复
To: starfish
果然厉害--把你的模型连到程序中去验证了一下,是对的。
不知道该算法速度怎样?(特别是当节点多的时候会把内存耗光吗?)。
另外请你告诉我该算法在哪本书上有?以后好写论文!
最后衷心感谢starfish和ritchiex两位老师!!!
starfish
2001-09-20
打赏
举报
回复
TO: coolqi(xiaoqi)
我的程序满足你说的两个条件:
1。同一节点不能经过两次。
2。所有长度的路径都能找到,并且没有漏掉的路径。
你看一下程序,很简单的。
coolqi
2001-09-19
打赏
举报
回复
to: starfish
迭代部分没太看懂!直接请问--该算法找到的路径是否满足下面的条件?
1。同一节点不能经过两次。
2。所有长度的路径都能找到,并且没有漏掉的路径。
请答复,急盼!拜谢!
starfish
2001-09-19
打赏
举报
回复
TO: coolqi
你看看http://www.csdn.net/expert/TopicView.asp?id=253130
coolqi
2001-09-19
打赏
举报
回复
1.回复ritchiex:
深度优先和广度优先两种算法是不是搜索中的算法?
2.回复CanFly:
目前的程序就是用的图论的方法,但节点数超过30个就会很快耗尽内存,造成死机。
有没有更快速的算法?
3.回复starfish:
你说的是否是9月10日的“图论模型”?我已看过,但我要的是两节点间所有路径是由什么节点组成的,而不要求总的路径数。
请多多指教,拜托!(最好有程序)
starfish
2001-09-19
打赏
举报
回复
这个问题上次有人问过了,我已经作了回答并写了程序,你在这个论坛搜索一下
CanFly
2001-09-19
打赏
举报
回复
你可用图论中的方法
ritchiex
2001-09-19
打赏
举报
回复
一般应该是只有深度优先和广度优先两种算法。
最短
路径
算法
---
有向图
最短
路径
算法
---
有向图
、
算法
实现思路 拓扑排序,其实就是
寻找
一个入度为0的顶点,该顶点是拓扑排序
中
的第一个顶点序列,将之标记删除,然后将与该顶点相邻接的顶点的入度减1,再继续
寻找
入度为0的顶点,直至所有的顶点都已经标记删除或者图
中
有环。 从上可以看出,关键是
寻找
入度为0的顶点。 一种方式是遍历整个图
中
的顶点,...
遍历图
中
两点
间
所有
路径
Python代码
遍历图
中
两点
间
所有
路径
Python代码 非常暴力,直接搜索 求图
中
两点
间
的所有
路径
(包括最短
路径
) 求(有向)图
中
任意
两点
间
所有
路径
快速
寻找
有向图
中
两点
间
的所有
路径
输入邻接矩阵(Numpy矩阵),起点,终点, 返回包含图
中
起点和终点
间
所有
路径
的list def find_all_path(self, graph, start, end): p = [[start, ]] pd = [] while len(p): # 仍有潜在可行
路径
快速
寻找
有向图
中
两点
间
的所有
路径
这个
算法
的效率应该是理论上最好的了,因为要求出
两点
间
所有的
路径
,必须考察每种可能(否则的话信息量不够),所以这个回溯法是唯一的方法。至于运算的速度,取决于你的图的规模和顶点的数目,这个
算法
的复杂度是O(VE)。内存耗光的问题一般不会出现,我试过用这个计算5000个节点的随机地图,速度还是蛮快的,一下子就出解了。该
算法
很简单,基本思想就是回溯。 #include #include #inclu
图论
算法
<六>:DFS求
有向图
或无向图
两点
间
所有
路径
DFS求
有向图
或无向图
两点
间
所有
路径
。缺点:分支节点数量很大时,无向图效率很低,不推荐使用。
图
算法
- 只需“五步” ,获取两节点
间
的所有
路径
(非递归方式)
在实现 “图” 数据结构时,会遇到 “获取
两点
之
间
是所有
路径
” 这个
算法
问题,网上的资料大多都是利用递归
算法
来实现(见文末的参考文章)。 我们知道在 JS
中
用递归
算法
很容易会让调用栈溢出,为了能在生产环境
中
使用,必须要用非递归方式的去实现。 经过一番探索,实现的思路主要来自文章 《求
两点
间
所有
路径
的遍历
算法
》 ,只是该文
中
并没有给出具体的实现细节,需要自己去实现;最终本文的实现结合类似《
算法
-...
数据结构与算法
33,028
社区成员
35,337
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章