求助明天的面试题,大家帮看看 -----使用java语言,编写在有向图中查找最小路径的算法

weichenggao 2011-08-01 10:01:08
此有向图是由通过"标准输入"进行输入,具体的输入格式是
<n1>:<n2>:<c1>
<n3>:<n4>:<c2>
<n5>:<n6>:<c3>
..
..
..
<nm>:<nn>:<cn>
其中,每一行<n1>:<n2>:<c1>
表示从<n1>节点到<n2>节点存在一个费用为<c1>的路径

此算法的输出是:从start节点到end节点找到一个费用为最小的路径,使用下面的形式输出:
start -> <m1> --> <m2> ....-> <mn> ->end: <cost>
其中<m1>,<m2>....<mn>为此路径上的节点,<cost>为此路径上总的花费

如果不存在这样的路径,就输出;此题无解
...全文
233 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
dongchao2049 2011-08-04
  • 打赏
  • 举报
回复
看不懂,不理解出题者的意图。
小赖赖 2011-08-03
  • 打赏
  • 举报
回复
可以用A star寻址算法
用递归计算当前点附近每一点到终点的费用
发现不可到达的点时回朔
a2008683 2011-08-03
  • 打赏
  • 举报
回复
你猛啊,,,厉害
daijope 2011-08-03
  • 打赏
  • 举报
回复
4. Shortest path in multistage graphs. Find the shortest path from 0 to 15 for the following graph.
A multistage graph is a graph (1) G=(V,E) with V partitioned into K >= 2 disjoint subsets such that if (a,b) is in E, then a is in Vi , and b is in Vi+1 for some subsets in the partition; and (2) | V1 | = | VK | = 1.

c语言的解法:

#include<iostream>
#include<sstream>
#include<string>
#include<fstream>
using namespace std;
#define MAX 16
#define INFTY 1000

void DIJKSTRA(int A[][MAX],int d[],int p[],int s)
{
int index;
int i,j,u=INFTY,x,y,w;
d[s]=0;//原点到其他点的距离

int S[15],Q[15];
for(i=1;i<=15;i++)
{
d[i]=INFTY;
p[i]=-1;
S[i]=0;
}
S[0]=1;//存已经纳入的点
i=0;
for(w=0;w<=15;w++)//寻找距离最短的点
{
u=INFTY;
for(j=0;j<=15;j++)
{
if(A[i][j]!=INFTY)
if(d[j]>d[i]+A[i][j])
{
d[j]=d[i]+A[i][j];
p[j]=i;
}
}

for(x=1;x<=15;x++)
{
if(S[x]!=1)
if(u>d[x])
{
u=d[x];
y=x;
//cout<<u<<"d"<<endl;
}
}

S[y]=1;//把最短距离的点纳入进来
i=y;
}





}
void print(int p[],int end)
{
if(p[end] == 0)
{
cout << end<< "->";
return;
}
print(p,p[end]);
cout << end << "->";
}

int main()
{
int A[MAX][MAX];
int d[MAX],p[MAX];
int i,j,v;
string str;

for(i=0;i<=15;i++)
for(j=0;j<=15;j++)
A[i][j]=INFTY;

ifstream cin("4.txt");
while(getline(cin,str))
{
istringstream stream(str);
stream>>i>>j>>v;
A[i][j]=v;
}
//输入邻接矩阵结束

DIJKSTRA(A,d,p,0);
cout<<"0->";
print(p,15);
cout<<"15";
getchar();
getchar();
getchar();
}



这是现成的代码,粘贴上来,希望可以帮到你。。。
walkman_22 2011-08-02
  • 打赏
  • 举报
回复
数据结构的题感觉用C或者C++多些~~

当年这一门没学好啊~~悲剧。
zhai790921971 2011-08-02
  • 打赏
  • 举报
回复
路径 不会 不过帮你顶先
  • 打赏
  • 举报
回复
要解决的是,计算时没有算重复的路径
lacus87 2011-08-02
  • 打赏
  • 举报
回复
题目有个地方不明 。可以逆向么?
即:N1--N2 花C1,可以N2--N1 花C1么?
pmlxp 2011-08-02
  • 打赏
  • 举报
回复
不清楚
qybao 2011-08-02
  • 打赏
  • 举报
回复
节点n2到n3或者到nx没有路径吗?
最基本的图遍历问题,每个节点设置一个状态,可以采用堆栈的压栈出栈方式来处理
liushuo1987 2011-08-02
  • 打赏
  • 举报
回复
帮顶,问一句,能说下是那个公司不?
weichenggao 2011-08-02
  • 打赏
  • 举报
回复
大家帮看看啊,明天面试的题目,先谢谢拉
lost_guy_in_scut 2011-08-01
  • 打赏
  • 举报
回复
只知道算法,嘿嘿。貌似上学的时候学过单源最短路径算法,该算法可以实现一个点到所有点的最短路径。具体算法思想大概是设置顶点集合s并不断的做贪心选择扩充这个集合。一个顶点属于集合s当且仅当从源到该顶点的路径已经。初始化时,s中只包含源,也就是start节点。设u是g的某一个顶点,把从源到u切中间只经过s中顶点的路径称为源到u的特殊路径,并用数组dist记录当前每个顶点所对应的最短特殊路径。该算法每次从v-s中取出具有最短特殊路长度的顶点u添加到s中,同时对数据dist进行必要的修改。
哈哈。应该看的模模糊糊吧,去搜下单源最短路径算法吧,应该能解决你的问题。
softroad 2011-08-01
  • 打赏
  • 举报
回复
没看明白,顶
1.算法是程序的灵魂,优秀的程序在对海量数据处理时,依然保持高速计算,就需要高效的数据结构和算法支撑。2.网上数据结构和算法的课程不少,但存在两个问题:1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了2)说是讲数据结构和算法,但大多是挂羊头卖狗肉,算法讲的很少。 本课程针对上述问题,有针对性的进行了升级 3)授课方式采用图解+算法游戏的方式,让课程生动有趣好理解 4)系统全面的讲解了数据结构和算法, 除常用数据结构和算法外,还包括程序员常用10大算法:二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、马踏棋盘算法。可以解决面试遇到的最短路径最小生成树、最小连通图、动态规划等问题及衍生出的面试题,让你秒杀其他面试小伙伴3.如果你不想永远都是代码工人,就需要花时间来研究下数据结构和算法。教程内容:本教程是使用Java来讲解数据结构和算法,考虑到数据结构和算法较难,授课采用图解加算法游戏的方式。内容包括: 稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、缀、后缀表达式、缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序、排序速度分析、二分查找、插值查找、斐波那契查找、散列、哈希表、二叉树、二叉树与数组转换、二叉排序树(BST)、AVL树、线索二叉树、赫夫曼树、赫夫曼编码、多路查找树(B树B+树和B*树)、图、图的DFS算法和BFS、程序员常用10大算法、二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法马踏棋盘算法。学习目标:通过学习,学员能掌握主流数据结构和算法的实现机制,开阔编程思路,提高优化程序的能力。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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