| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 368 人关注过本帖
标题:关于迪杰斯特拉算法C语言实现,有几句话不理解,求帮助
只看楼主 加入收藏
mmrx
Rank: 2
等 级:论坛游民
帖 子:42
专家分:71
注 册:2012-10-18
结帖率:60%
收藏
已结贴  问题点数:20 回复次数:4 
关于迪杰斯特拉算法C语言实现,有几句话不理解,求帮助
程序代码:
#define MAX_VERTEX_NUM 11 //最大顶点个数
#define INT_MAX 32767
#define TRUE 1
#define FALSE 0

//p[v][w]为true,代表w是v0到v当前求得最短路径上的顶点
typedef int PathMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
//d[v]表示v0到v的距离
typedef int Distance[MAX_VERTEX_NUM];
//final[v]为true当且仅当v属于S,即已经求得从v0到v的最短路径
int final[MAX_VERTEX_NUM];

/*******邻接矩阵*******/
typedef struct Graph
{
    int vexs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//带权无向图的权,INT_MAX表示不连通
    char vertexType[MAX_VERTEX_NUM][14];//顶点向量,存储名称
    int vexnum,arcnum;//图的顶点数和边数
}MGraph;
//Dijkstra算法寻找最短路径
int findShortsetPath( MGraph g,int v0,PathMatrix* P,Distance* D)
{
    int v,w,i;
    for( v=0;v<g.vexnum;v++ )
    {
        final[v] = FALSE;
        (*D)[v] = g.vexs[v0][v];
        for( w=0;w<g.vexnum;w++ )
        {
            //设空路径
            (*P)[v][w] = FALSE;
        }
        if( (*D)[v]<INT_MAX )
        {
            (*P)[v0][v] = TRUE;
            (*P)[v][v] = TRUE;
        }//if
    }//for
    D[v0] = 0;
    //初始化,v0顶点属于集合S
    final[v0] = TRUE;
    //开始主循环,每次求得v0到某个顶点v的最短路径,并加v到s集合中
    //g.vexnum-1 个顶点
    for( i=0;i<g.vexnum;i++ )
    {
        int min = INT_MAX;
        //找到距离v0最近的点
        for( w=0;w<g.vexnum;w++ )
        {
            //从v0到w未求得最短路径,执行。对于已经求得的最短路径,
            //忽略这些点,即忽略在集合S中的顶点
            if( !final[w] )
                //如果点v0到w的相比其他点,更近
                if( (*D)[w]<min )
                {
                    v = w;
                    min = (*D)[w];
                }//if
        }//for
        //距离v0最近的点v,加入集合s
        final[v] = TRUE;
        //更像当前最短路径
        for( w=0;w<g.vexnum;w++ )
        {
            //顶点w不在最短路径集合内,并且v0到v的距离加v到w的距离小于v0到w的距离
            //更新D[w]
            if( !final[w] && (min+g.vexs[v][w]<(*D)[w]) )
            {
                (*D)[w] = min+g.vexs[v][w];
                (*P)[w] = (*P)[v];//我不理解这句话
                (*P)[w][w] = TRUE;
            }//if
        }//for
    }//for
}


(*P)[w] = (*P)[v];这句话是吧第v行的地址给了第w行了?那么二维数组p的第w行不是就被覆盖了,第w行不久丢了么?
(*P)[w][w] = TRUE;之后又加这句话,那为什么不写成(*P)[v][w] = TRUE;呢?
一共三个问题,请教大神。
搜索更多相关主题的帖子: C语言 
2013-11-20 17:55
mmrx
Rank: 2
等 级:论坛游民
帖 子:42
专家分:71
注 册:2012-10-18
收藏
得分:0 
等...
2013-11-20 19:03
mmrx
Rank: 2
等 级:论坛游民
帖 子:42
专家分:71
注 册:2012-10-18
收藏
得分:0 
...没人么
2013-11-20 20:49
mmrx
Rank: 2
等 级:论坛游民
帖 子:42
专家分:71
注 册:2012-10-18
收藏
得分:0 
...求助
2013-11-21 14:56
pink_duo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:209
专家分:1054
注 册:2013-11-5
收藏
得分:20 
*P)[w] = (*P)[v];这句话是吧第v行的地址给了第w行了? 是的

二维数组p的第w行不是就被覆盖了,第w行不久丢了么? 没有丢失,内存中数据依然存在,这里是读取地址改变

(*P)[w][w] = TRUE;之后又加这句话,那为什么不写成(*P)[v][w] = TRUE;呢? 从程序里看,可以这样写

埋头做牛,抬头做人,低头做狗
2013-11-21 16:03
快速回复:关于迪杰斯特拉算法C语言实现,有几句话不理解,求帮助
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015803 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved