据说这里牛人多,所以只好到这里来求教了,关于一个算法的问题

aboutagirl 2004-10-27 10:17:29
比如说
A有朋友BCD,
B有朋友EFG,
E有朋友HIJ,F有朋友KLM

这种人与人之间的网状的关系,如何获得一个最短路径,比如A要认识M,那他应该通过谁、到谁才可以认识M?

我目前只会这样一种思路,
先获得A有那些朋友,那么再替规查询A的所有朋友。。。。。。依次类推,知道发现M为止。

这样做在数据量小,朋友关系层数比较少的时候还行,但是层次一多,代码很容易就超时,不知道各位高手有什么好的算法实现这个功能?小弟感激不尽啊^^

有朋友跟我提过"六度分离理论",我听了以后更茫然了......


PS:在下不懂C、Cpp(惭愧啊^^),高手能否提示一个思路或流程启示在下?
...全文
450 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
allen830826 2004-10-28
  • 打赏
  • 举报
回复
图论中的求最短路径问题
算法具体写起来比较复杂
flyingscv 2004-10-28
  • 打赏
  • 举报
回复
这个没有权值,比最短路径简单的多
属于o(n)级别的
made_in_ 2004-10-27
  • 打赏
  • 举报
回复
采用邻接表存储,利用最短路径算法,任一本数据结构的书上都有详细介绍。
xuzheng318 2004-10-27
  • 打赏
  • 举报
回复
用遍历好像就能解决!
gaoguoli 2004-10-27
  • 打赏
  • 举报
回复

如果没有交叉,最好用根据上述关系建立多叉树,然后对多叉树进行检索,最短路径就可得到。
dudu妈 2004-10-27
  • 打赏
  • 举报
回复
学习!!!!!!!!!!!!!!!!!!!1
languagec 2004-10-27
  • 打赏
  • 举报
回复
sad_4978 2004-10-27
  • 打赏
  • 举报
回复
大家說的都很正確,我就不補充了!:)
Visual_Li 2004-10-27
  • 打赏
  • 举报
回复
最短路径算法,很常见的
Visual_Li 2004-10-27
  • 打赏
  • 举报
回复
呵呵,数据结构的东西
windindance 2004-10-27
  • 打赏
  • 举报
回复
Dijkstra最短路径算法。
时间复杂度为O(n^3)。
网上搜索一下,很多。
lynnboy 2004-10-27
  • 打赏
  • 举报
回复
用队列。
把出队列的元素的每个朋友放到队列尾,直到某个队列头有朋友M。
zxl_llx 2004-10-27
  • 打赏
  • 举报
回复
由于你的朋友都不交互认识,可以采用树的结构,遍历查找就可以了!
laomai 2004-10-27
  • 打赏
  • 举报
回复
这好象是图论里的最短路径问题,建议你先看看图轮和数据结构的书,呵呵
hxblvc 2004-10-27
  • 打赏
  • 举报
回复
学习...
  • 打赏
  • 举报
回复
数据结构中很多,最短路径问题
yegaofei 2004-10-27
  • 打赏
  • 举报
回复
用prolog吧 方便
MN归来 2004-10-27
  • 打赏
  • 举报
回复
我觉得 yangfasheng(悟法:前面是绝路,希望在拐角)
说的很对
用离散数学的知识可以解决
hxy2003 2004-10-27
  • 打赏
  • 举报
回复
..
liujingfu123 2004-10-27
  • 打赏
  • 举报
回复
/*************************************************************************
** 所有顶点之间的最短路径 (Floyd 弗洛伊德算法)
**
** 你的人与人之间的网状的关系用有向网络(图)G来表示
** C是有向网络G的带权邻接矩阵
** A是图G的顶点之间的路径长度矩阵
*************************************************************************/
int path[n][n]; //路径矩阵
FLOYD(float A[][n], float C[][n]) // A是顶点之间的路径长度矩阵,C是有向网络G的带权邻接矩阵
{
int i,j,k,netx;
int max = 5000;
for(i=0;i<n;i++) //设置A和path的初始值
for(j=0;j<n;j++)
{
if(C[i][j]!=max)
path[i][j] = j; //j是i的后继
else
path[i][j] = 0;
A[i][j] = C[i][j];
}
for(k=0;k<n;k++)
//做n次迭代,每次均试图将顶点k扩充到当前求得的从i到j的最短路径P(i,j)上
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(A[i][j] > (A[i][k] + A[k][j]))
{
A[i][j] = A[i][k] + A[k][j]; //修改长度
path[i][j] = path[i][k]; //修改路径
}
for(i=0;i<n;i++) //输出所有顶点对i,j之间的最短路径P(i,j)的长度及路径
for(j=0;j<n;j++)
{
printf("%f",A[i][j]); //输出P(i,j)的长度
next = path[i][j] //next 为起点i的后继顶点
if(next == 0) // i 无后继表示P(i,j)不存在
pintf("%d to %d no path.\n",i+1,j+1);
else
{
printf("%d",i+1);
while(next != j)
{
printf("---->%d",next + 1); //打印后继结点
next = path[next][j]; //继续找下一个后继结点
}
printf(""---->%d\n",j + 1); //打印终点
}
}
} //FLOYD


来自 《数据结构--用c语言描述》 唐策善 李龙澍 黄刘生 编著 高等教育出版社 1994年版

楼主你自己去看看吧
加载更多回复(6)

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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