有没有好的算法--快速寻找有向图中两点间的所有路径?

coolqi 2001-09-19 05:17:09
...全文
964 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
  • 打赏
  • 举报
回复
一般应该是只有深度优先和广度优先两种算法。

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧