| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 521 人关注过本帖, 1 人收藏
标题:关于最短路径问题,望版主能给予帮助
只看楼主 加入收藏
世界模型
Rank: 4
等 级:业余侠客
威 望:1
帖 子:240
专家分:226
注 册:2010-9-12
结帖率:97.44%
收藏(1)
已结贴  问题点数:20 回复次数:1 
关于最短路径问题,望版主能给予帮助
关于最短路径的问题(迪杰斯特拉算法)不是很明白,希望能举一到两个例子(邻接表或邻接矩阵),并附带说明,不胜感激
搜索更多相关主题的帖子: 路径 版主 
2010-12-04 22:56
chenhaiquanw
Rank: 2
等 级:论坛游民
帖 子:9
专家分:70
注 册:2010-11-28
收藏
得分:20 
#include <stdio.h>
#include <stdlib.h>

#define MAXLENTH 1000
int cost[7][7]; //存放图的邻接矩阵
int dist[7]; //存放最顶点的最短路径


///////////////////////////////////////////////////////////////////////
//
// 函数名       : creategraph
// 功能描述     : 用数组的方法创建图(node存放的是比如1 2 3 意思是1->2之间的距离为3)
// 参数         : int * node
// 参数         : int num
// 返回值       : void
//
///////////////////////////////////////////////////////////////////////
void creategraph(int * node,int num)
{
    int from;
    int to ;
    int i;
    for(i=0;i<num;i++)
    {
        from=node[3*i];
        to=node[3*i+1];
        cost[from][to]=node[3*i+2];
    }
}


///////////////////////////////////////////////////////////////////////
//
// 函数名       : shortestpath
// 功能描述     : dijkstra算法
// 参数         : int begin
// 参数         : int num
// 返回值       : void
//
///////////////////////////////////////////////////////////////////////
void shortestpath(int begin,int num)
{
    int selected[7];
    int min;
    int s;
    int i;
    int j;


    for(i=2;i<=num;i++)
    {
        dist[i]=cost[begin][i];//(dist初始化为存放从begin 这一点到其他顶点值)
        selected[i]=0;         //一个指示的数组,1表明算过了,0是初始值  
    }
    dist[begin]=0;            
    selected[begin]=1;
    printf("顶点1     2     3     4     5     6\n");
    for(i=1;i<=num;i++)
    {
        printf(" %4d ",dist[i]);  //初始化的路径长短.
    }
    printf("\n");
   



    for(i=1;i<=num-1;i++)
    {
        min=MAXLENTH;
        for(j=1;j<=num;j++)//从dist中找到最小的并且未标记的那个顶点,并标志为已算过
        {
        
            if(min > dist[j] && selected[j] == 0)
            {
                s=j;
                min=dist[s];

            }
        }
        selected[s]=1;

        
        for(j=1;j<=num;j++)        //根据找到的顶点进行修改dist数组,即原来的值dist[j]与(先到与经过刚刚找到的顶点s值dist[s],加上从s到j的距离cost[s][j])
        {
            if(dist[j] > (dist[s]+cost[s][j] )&& selected[j]==0)//比较发现先经过s再到j的距离比较小(且未标记过)则进行修改
            {
                dist[j]=dist[s]+cost[s][j];

            }
            printf(" %4d ",dist[j]);
        }
        printf("\n");
    }

}


void main()
{
    int i;
    int j;
    int node[7][3]=
    {
        {1,2,35},
        {2,3,45},
        {2,4,30},
        
        {3,5,25},
        {4,5,45},
        {4,6,130},

        {5,6,100}

    };
    for(i=1;i<=6;i++)
        for(j=1;j<=6;j++)
        {
            cost[i][j]=MAXLENTH;   //图的邻接矩阵的初始化.MAXLENTH=1000(意为无穷, 顶点之间不可达)
        }

    creategraph(node,6);      //创建图
    printf("带权图的矩阵\n");
    for(i=1;i<=6;i++)         //输出邻接矩阵
    {
        for(j=1;j<=6;j++)
            printf(" %4d ",cost[i][j]);
        printf("\n");
    }
    printf("从顶点1到各顶点最短距离计算过程\n");
    shortestpath(1,6);
   

}


2010-12-05 07:26
快速回复:关于最短路径问题,望版主能给予帮助
数据加载中...
 
   



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

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