回 帖 发 新 帖 刷新版面

主题:[原创]最短路径算法(求教,急!)

能不能用FibonacciHeap实现最短路径的算法啊(c++)?
很急的,谢谢了!

回复列表 (共5个回复)

沙发

我晕,怎么和我问的一样
你也是东大的么?

板凳

问题详细点,我看看

3 楼

这个文章里给了代码,http://algorithm.diy.myrice.com/resources/technical_artile/fibonacci_heap/fibonacci.htm

4 楼

5 楼

下面给出我 写的一个 求最短路径 的一个完整的程序。

   程序说明:
2维数组costarray定义了12个点中,任意两个点的距离,max表示这两个点是不相连的。MinCost是一个计算最短路径的函数,采用递归调用算法.第三个参数level表示递归调用到第几层,首次调用level=0,在函数中再次调用为level=1,这个参数的设置主要是为了记录路径用的,当这个函数计算完毕,一条从起点到终点的路径就存储到数组 minway 中,可以用printPath打印出路径.
  

#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);
}

我来回复

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