回 帖 发 新 帖 刷新版面

主题:求教大家这到题怎么做。我没学过这东西的。来帮帮我撒!谢谢

标题:求最短路径
内容:甲乙丙丁未 五位成员分别距离为
甲-→乙300KM       甲-→未3000     乙-→丙2500    乙-→丁800
丙-→未1000        丁-→甲2000     丁-→丙400     丁-→未1200
未-→甲500
现在从未地出发到其他个城市最捷路径
要求:1。写出系统需求并建模
      2。编程实现,界面友好
      3。输出各条最短路径
各位大大。谢谢你们了。帮我做一下。尽量详细点。谢谢了。

回复列表 (共3个回复)

沙发

1。题目出得不好,“甲乙丙丁”是天干,而“未”的地支。混用他们,让人不知所以。顺便列出10天干和12地支。甲乙丙丁戊己庚辛壬癸, 子丑寅卯辰巳午未申酉戌亥。

  2。下面给出我写的一个完整的代码。2维数组costarray定义了12个点中,任意两个点的距离,max表示这两个点是不相连的。MinCost是一个计算最短路径的函数,采用递归调用算法.第三个参数level表示递归调用到第几层,首次调用level=0,在函数中再次调用为level=1,这个参数的设置主要是为了记录路径用的,当这个函数计算完毕,一条从起点到终点的路径就存储到数组 minway 中,可以用printPath打印出路径.
  3.递归调用对初学者来说,是个难点,需要较强的逻辑思维.这个程序可能令你可能难以理解.事实上,我最初看到的这道题来自一个硕士生的课堂作业.然后,我独立完成了这个程序(大约用了2-3个小时),如果你是一个初学者.看不懂这个程序不要泄气.


#include <stdio.h>
#include <time.h>

#define max 100
#define START_NODE  0
#define END_NODE    11

int costarray[12][12]=
{
    // 0    1   2   3   4   5   6   7   8   9   10  11
    {max,    9,    7,    3,    2,    max,max,max,max,max,max,max},  //0
    {max,    max,max,max,max,4,    2,    1,    max,max,max,max},  //1
    {max,    max,max,max,max,2,    7,    max,max,max,max,max},  //2
    {max,    max,max,max,max,max,max,11,    max,max,max,max},  //3
    {max,    max,max,max,max,max,11,    8,    max,max,max,max},  //4
    {max,    max,max,max,max,max,max,max,6,    5,    max,max},  //5
    {max,    max,max,max,max,max,max,max,4,    3,    max,max},  //6
    {max,    max,max,max,max,max,max,max,max,5,    6,    max},  //7
    {max,    max,max,max,max,max,max,max,max,max,max,4},    //8
    {max,    max,max,max,max,max,max,max,max,max,max,2},       //9
    {max,    max,max,max,max,max,max,max,max,max,max,5},    //10
    {max,    max,max,max,max,max,max,max,max,max,max,max}   //11
};

 
int minway[12];

int cost=100*max;

void printPath()
{
    int i;
    for (i=0;true;i++)
    {
        printf( "%d",minway[i]);
        if (minway[i]==END_NODE)
            break;
        else
            printf("->");
    }
    printf("\n");
}

int MinCost(int i,int j,int level)
{
    int min=10000*max;
    int k,t;
    
    minway[level]=i;
    if (costarray[i][j]!=max)
    {
        min=costarray[i][j];
        if (j==END_NODE)
            minway[level+1]=j;
    }

    for(k=START_NODE;k<END_NODE;k++)
    {
        if (k==i || k==j || costarray[i][k] ==max)
            continue;
        
        t=costarray[i][k]+MinCost(k,j,level+1);
        if (t<min)
        {
            min=t;
            if (i==START_NODE)
                printPath();
        }
    }
    return min;
}

void main()
{    
    int cost=MinCost(START_NODE,END_NODE,0);
    printf("min cost=%d\n",cost);
}

板凳

谢谢这位大哥。我虽然看的还是不太懂。
毕竟是初学啊。
还是要谢谢的啊。
我回去在研究一下的。谢谢了

3 楼

刚好有个作业做交通查询系统,

<当前交通信息>
<源  站><目的站><耗时><费用>
甲      乙      300   0
甲      未      3000  0
乙      丙      2500  0
乙      丁      800   0
丙      未      1000  0
丁      甲      2000  0
丁      丙      400   0
丁      未      1200  0
未      甲      500   0
---------------------------
输入格式:<源站名> <目的站名> <耗时> <费用>end-结束输入
>end
选择一种策略
0-中转次数最少 1-最快 2-最省
>1
输入源站名:(end-结束)
>未
输入目的站名:
>甲
最短路径:500
未-甲
输入源站名:(end-结束)
>未
输入目的站名:
>乙
最短路径:800
未-甲-乙
输入源站名:(end-结束)
>未
输入目的站名:
>丙
最短路径:2000
未-甲-乙-丁-丙
输入源站名:(end-结束)
>未
输入目的站名:
>丁
最短路径:1600
未-甲-乙-丁

我用floyd算法做的,可以查下资料。

我来回复

您尚未登录,请登录后再回复。点此登录或注册